Commit f80ea09a4594a4e242d5e0c8a790ceabcd5580b6
1 parent
814833f5
加入费用详情
Showing
67 changed files
with
3975 additions
and
8 deletions
src/api/dev/serviceProvideManageApi.js
| @@ -71,4 +71,18 @@ export function getServiceProvideDetail(params) { | @@ -71,4 +71,18 @@ export function getServiceProvideDetail(params) { | ||
| 71 | reject(error) | 71 | reject(error) |
| 72 | }) | 72 | }) |
| 73 | }) | 73 | }) |
| 74 | +} | ||
| 75 | +export function deleteServiceProvide(data) { | ||
| 76 | + return new Promise((resolve, reject) => { | ||
| 77 | + request({ | ||
| 78 | + url: '/serviceProvide.deleteServiceProvide', | ||
| 79 | + method: 'post', | ||
| 80 | + data | ||
| 81 | + }).then(response => { | ||
| 82 | + const res = response.data | ||
| 83 | + resolve(res) | ||
| 84 | + }).catch(error => { | ||
| 85 | + reject(error) | ||
| 86 | + }) | ||
| 87 | + }) | ||
| 74 | } | 88 | } |
| 75 | \ No newline at end of file | 89 | \ No newline at end of file |
src/api/fee/feeDetailApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 获取费用详情 | ||
| 5 | + * @param {Object} params 查询参数 | ||
| 6 | + * @returns {Promise} Promise对象 | ||
| 7 | + */ | ||
| 8 | +export function getFeeDetail(params) { | ||
| 9 | + return new Promise((resolve, reject) => { | ||
| 10 | + request({ | ||
| 11 | + url: '/fee.listFee', | ||
| 12 | + method: 'get', | ||
| 13 | + params | ||
| 14 | + }).then(response => { | ||
| 15 | + const res = response.data | ||
| 16 | + resolve(res) | ||
| 17 | + | ||
| 18 | + }).catch(error => { | ||
| 19 | + reject(error) | ||
| 20 | + }) | ||
| 21 | + }) | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * 获取缴费记录列表 | ||
| 26 | + * @param {Object} params 查询参数 | ||
| 27 | + * @returns {Promise} Promise对象 | ||
| 28 | + */ | ||
| 29 | +export function getPaymentRecords(params) { | ||
| 30 | + return new Promise((resolve, reject) => { | ||
| 31 | + request({ | ||
| 32 | + url: '/fee.listPaymentRecords', | ||
| 33 | + method: 'get', | ||
| 34 | + params | ||
| 35 | + }).then(response => { | ||
| 36 | + const res = response.data | ||
| 37 | + resolve(res) | ||
| 38 | + | ||
| 39 | + }).catch(error => { | ||
| 40 | + reject(error) | ||
| 41 | + }) | ||
| 42 | + }) | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +/** | ||
| 46 | + * 获取按月展示数据 | ||
| 47 | + * @param {Object} params 查询参数 | ||
| 48 | + * @returns {Promise} Promise对象 | ||
| 49 | + */ | ||
| 50 | +export function getMonthlyFeeData(params) { | ||
| 51 | + return new Promise((resolve, reject) => { | ||
| 52 | + request({ | ||
| 53 | + url: '/fee.listMonthlyFee', | ||
| 54 | + method: 'get', | ||
| 55 | + params | ||
| 56 | + }).then(response => { | ||
| 57 | + const res = response.data | ||
| 58 | + resolve(res) | ||
| 59 | + | ||
| 60 | + }).catch(error => { | ||
| 61 | + reject(error) | ||
| 62 | + }) | ||
| 63 | + }) | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +/** | ||
| 67 | + * 获取关联房屋数据 | ||
| 68 | + * @param {Object} params 查询参数 | ||
| 69 | + * @returns {Promise} Promise对象 | ||
| 70 | + */ | ||
| 71 | +export function getRelatedRooms(params) { | ||
| 72 | + return new Promise((resolve, reject) => { | ||
| 73 | + request({ | ||
| 74 | + url: '/fee.listRelatedRooms', | ||
| 75 | + method: 'get', | ||
| 76 | + params | ||
| 77 | + }).then(response => { | ||
| 78 | + const res = response.data | ||
| 79 | + resolve(res) | ||
| 80 | + | ||
| 81 | + }).catch(error => { | ||
| 82 | + reject(error) | ||
| 83 | + }) | ||
| 84 | + }) | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +/** | ||
| 88 | + * 获取关联车辆数据 | ||
| 89 | + * @param {Object} params 查询参数 | ||
| 90 | + * @returns {Promise} Promise对象 | ||
| 91 | + */ | ||
| 92 | +export function getRelatedCars(params) { | ||
| 93 | + return new Promise((resolve, reject) => { | ||
| 94 | + request({ | ||
| 95 | + url: '/fee.listRelatedCars', | ||
| 96 | + method: 'get', | ||
| 97 | + params | ||
| 98 | + }).then(response => { | ||
| 99 | + const res = response.data | ||
| 100 | + resolve(res) | ||
| 101 | + }).catch(error => { | ||
| 102 | + reject(error) | ||
| 103 | + }) | ||
| 104 | + }) | ||
| 105 | +} | ||
| 0 | \ No newline at end of file | 106 | \ No newline at end of file |
src/api/fee/feeDetailCarApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function queryOwnerCars(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/owner.queryOwnerCars', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + if (res.code == 0) { | ||
| 16 | + resolve(res) | ||
| 17 | + } else { | ||
| 18 | + reject(new Error(res.msg || 'Failed to query owner cars')) | ||
| 19 | + } | ||
| 20 | + }).catch(error => { | ||
| 21 | + reject(error) | ||
| 22 | + }) | ||
| 23 | + }) | ||
| 24 | +} | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/api/fee/feeDetailConfigApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function listFeeConfigs(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/feeConfig.listFeeConfigs', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + if (res.code == 0) { | ||
| 16 | + resolve(res) | ||
| 17 | + } else { | ||
| 18 | + reject(new Error(res.msg || 'Failed to list fee configs')) | ||
| 19 | + } | ||
| 20 | + }).catch(error => { | ||
| 21 | + reject(error) | ||
| 22 | + }) | ||
| 23 | + }) | ||
| 24 | +} | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/api/fee/feeDetailContractApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function queryContract(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/contract/queryContract', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + if (res.code == 0) { | ||
| 16 | + resolve(res) | ||
| 17 | + } else { | ||
| 18 | + reject(new Error(res.msg || 'Failed to query contract')) | ||
| 19 | + } | ||
| 20 | + }).catch(error => { | ||
| 21 | + reject(error) | ||
| 22 | + }) | ||
| 23 | + }) | ||
| 24 | +} | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/api/fee/feeDetailDiscountApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryApplyRoomDiscount(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/applyRoomDiscount/queryApplyRoomDiscount', | ||
| 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 || 'Failed to query apply room discount')) | ||
| 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/fee/feeDetailHisApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryHisFee(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/fee.queryHisFee', | ||
| 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 || 'Failed to query fee history')) | ||
| 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/fee/feeDetailHisFeeApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function queryFeeDetail(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/fee.queryFeeDetail', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + resolve(res) | ||
| 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/fee/feeDetailImportApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryImportFeeDetail(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/importFee/queryImportFeeDetail', | ||
| 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 || 'Failed to query import fee detail')) | ||
| 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/fee/feeDetailMeterApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function listMeterWaters(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/meterWater.listMeterWaters', | ||
| 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 || 'Failed to list meter waters')) | ||
| 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/fee/feeDetailMonthFeeApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function listMonthFee(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/fee.listMonthFee', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + if (res.code == 0) { | ||
| 16 | + resolve(res) | ||
| 17 | + } else { | ||
| 18 | + reject(new Error(res.msg || 'Failed to list month fee')) | ||
| 19 | + } | ||
| 20 | + }).catch(error => { | ||
| 21 | + reject(error) | ||
| 22 | + }) | ||
| 23 | + }) | ||
| 24 | +} | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/api/fee/feeDetailOwnerApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryOwners(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/owner.queryOwners', | ||
| 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 || 'Failed to query owners')) | ||
| 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/fee/feeDetailReceiptApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryFeeReceipt(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/feeReceipt/queryFeeReceipt', | ||
| 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 || 'Failed to query apply room discount')) | ||
| 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/fee/feeDetailRoomApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 3 | + | ||
| 4 | +export function queryRooms(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/room.queryRooms', | ||
| 8 | + method: 'get', | ||
| 9 | + params: { | ||
| 10 | + ...params, | ||
| 11 | + communityId: getCommunityId() | ||
| 12 | + } | ||
| 13 | + }).then(response => { | ||
| 14 | + const res = response.data | ||
| 15 | + resolve(res) | ||
| 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/fee/feeDetailSubApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function listPayFeeSub(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/feeSub.listPayFeeSub', | ||
| 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 || 'Failed to get fee sub list')) | ||
| 15 | + } | ||
| 16 | + }).catch(error => { | ||
| 17 | + reject(error) | ||
| 18 | + }) | ||
| 19 | + }) | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +export function listFee(params) { | ||
| 23 | + return new Promise((resolve, reject) => { | ||
| 24 | + request({ | ||
| 25 | + url: '/fee.listFee', | ||
| 26 | + method: 'get', | ||
| 27 | + params | ||
| 28 | + }).then(response => { | ||
| 29 | + const res = response.data | ||
| 30 | + if (res.code === 0) { | ||
| 31 | + resolve(res) | ||
| 32 | + } else { | ||
| 33 | + reject(new Error(res.msg || 'Failed to get fee list')) | ||
| 34 | + } | ||
| 35 | + }).catch(error => { | ||
| 36 | + reject(error) | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | +} | ||
| 0 | \ No newline at end of file | 40 | \ No newline at end of file |
src/api/fee/mergeFeeApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function mergePayFee(data) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/feeSub.mergePayFee', | ||
| 7 | + method: 'post', | ||
| 8 | + data | ||
| 9 | + }).then(response => { | ||
| 10 | + const res = response.data | ||
| 11 | + if (res.code === 0) { | ||
| 12 | + resolve(res) | ||
| 13 | + } else { | ||
| 14 | + reject(new Error(res.msg || 'Failed to merge fee')) | ||
| 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/components/fee/feeDetailCar.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table :data="feeDetailCarInfo.cars" style="width: 100%"> | ||
| 5 | + <el-table-column prop="carNum" :label="$t('feeDetailCar.licensePlate')" align="center"></el-table-column> | ||
| 6 | + <el-table-column :label="$t('feeDetailCar.licenseType')" align="center"> | ||
| 7 | + <template slot-scope="scope"> | ||
| 8 | + <span v-if="scope.row.leaseType == 'T'">{{$t('feeDetailCar.temporaryCar')}}</span> | ||
| 9 | + <span v-else>{{scope.row.leaseTypeName}}</span> | ||
| 10 | + </template> | ||
| 11 | + </el-table-column> | ||
| 12 | + <el-table-column prop="carTypeName" :label="$t('feeDetailCar.carType')" align="center"></el-table-column> | ||
| 13 | + <el-table-column prop="carColor" :label="$t('feeDetailCar.color')" align="center"></el-table-column> | ||
| 14 | + <el-table-column :label="$t('feeDetailCar.owner')" align="center"> | ||
| 15 | + <template slot-scope="scope">{{scope.row.ownerName}}({{scope.row.link}})</template> | ||
| 16 | + </el-table-column> | ||
| 17 | + <el-table-column :label="$t('feeDetailCar.parkingSpace')" align="center"> | ||
| 18 | + <template slot-scope="scope"> | ||
| 19 | + <span v-if="scope.row.areaNum && scope.row.state == '1001'"> | ||
| 20 | + {{scope.row.areaNum}}{{$t('feeDetailCar.parkingLot')}}{{scope.row.num}}{{$t('feeDetailCar.parkingSpace')}} | ||
| 21 | + </span> | ||
| 22 | + <span v-else>{{$t('feeDetailCar.spaceReleased')}}</span> | ||
| 23 | + </template> | ||
| 24 | + </el-table-column> | ||
| 25 | + <el-table-column :label="$t('feeDetailCar.validityPeriod')" align="center"> | ||
| 26 | + <template slot-scope="scope"> | ||
| 27 | + <span v-if="scope.row.leaseType == 'H'"> | ||
| 28 | + {{scope.row.startTime}}<br>~{{scope.row.endTime}} | ||
| 29 | + </span> | ||
| 30 | + <span v-else>-</span> | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + </el-table> | ||
| 34 | + | ||
| 35 | + <el-row class="margin-top"> | ||
| 36 | + <el-col :span="12"></el-col> | ||
| 37 | + <el-col :span="12"> | ||
| 38 | + <el-pagination | ||
| 39 | + @current-change="handleCurrentChange" | ||
| 40 | + :current-page="pagination.currentPage" | ||
| 41 | + :page-size="pagination.pageSize" | ||
| 42 | + layout="total, prev, pager, next" | ||
| 43 | + :total="pagination.total"> | ||
| 44 | + </el-pagination> | ||
| 45 | + </el-col> | ||
| 46 | + </el-row> | ||
| 47 | + </div> | ||
| 48 | + </div> | ||
| 49 | +</template> | ||
| 50 | + | ||
| 51 | +<script> | ||
| 52 | +import { queryOwnerCars } from '@/api/fee/feeDetailCarApi' | ||
| 53 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 54 | + | ||
| 55 | +export default { | ||
| 56 | + name: 'FeeDetailCar', | ||
| 57 | + data() { | ||
| 58 | + return { | ||
| 59 | + feeDetailCarInfo: { | ||
| 60 | + cars: [], | ||
| 61 | + memberId: '' | ||
| 62 | + }, | ||
| 63 | + pagination: { | ||
| 64 | + currentPage: 1, | ||
| 65 | + pageSize: 10, | ||
| 66 | + total: 0 | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + }, | ||
| 70 | + methods: { | ||
| 71 | + open(params) { | ||
| 72 | + this.feeDetailCarInfo.memberId = params.payerObjId | ||
| 73 | + this._loadFeeDetailCarData() | ||
| 74 | + }, | ||
| 75 | + _loadFeeDetailCarData() { | ||
| 76 | + const params = { | ||
| 77 | + communityId: getCommunityId(), | ||
| 78 | + memberId: this.feeDetailCarInfo.memberId, | ||
| 79 | + page: this.pagination.currentPage, | ||
| 80 | + row: this.pagination.pageSize | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + queryOwnerCars(params).then(res => { | ||
| 84 | + this.feeDetailCarInfo.cars = res.data | ||
| 85 | + this.pagination.total = res.records | ||
| 86 | + }).catch(error => { | ||
| 87 | + console.error('Failed to load car details:', error) | ||
| 88 | + }) | ||
| 89 | + }, | ||
| 90 | + handleCurrentChange(val) { | ||
| 91 | + this.pagination.currentPage = val | ||
| 92 | + this._loadFeeDetailCarData() | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | +} | ||
| 96 | +</script> | ||
| 0 | \ No newline at end of file | 97 | \ No newline at end of file |
src/components/fee/feeDetailCarDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailCarDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-car ref="feeDetailCar"></fee-detail-car> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailCar from './feeDetailCar' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailCarDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailCar | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailCar.open({ | ||
| 19 | + payerObjId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailConfig.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table :data="feeDetailConfigInfo.feeConfigs" style="width: 100%"> | ||
| 5 | + <el-table-column prop="feeTypeCdName" :label="$t('feeDetailConfig.feeType')" align="center"></el-table-column> | ||
| 6 | + <el-table-column prop="feeName" :label="$t('feeDetailConfig.feeItem')" align="center"></el-table-column> | ||
| 7 | + <el-table-column prop="feeFlagName" :label="$t('feeDetailConfig.feeFlag')" align="center"></el-table-column> | ||
| 8 | + <el-table-column prop="billTypeName" :label="$t('feeDetailConfig.reminderType')" align="center"></el-table-column> | ||
| 9 | + <el-table-column :label="$t('feeDetailConfig.paymentType')" align="center"> | ||
| 10 | + <template slot-scope="scope"> | ||
| 11 | + {{scope.row.paymentCd == '1200' ? $t('feeDetailConfig.prepaid') : $t('feeDetailConfig.postpaid')}} | ||
| 12 | + </template> | ||
| 13 | + </el-table-column> | ||
| 14 | + <el-table-column prop="paymentCycle" :label="$t('feeDetailConfig.paymentCycle')" align="center"></el-table-column> | ||
| 15 | + <el-table-column prop="units" :label="$t('feeDetailConfig.unit')" align="center"></el-table-column> | ||
| 16 | + <el-table-column prop="computingFormulaName" :label="$t('feeDetailConfig.formula')" align="center"></el-table-column> | ||
| 17 | + <el-table-column :label="$t('feeDetailConfig.unitPrice')" align="center"> | ||
| 18 | + <template slot-scope="scope"> | ||
| 19 | + {{scope.row.computingFormula == '2002' ? '-' : scope.row.squarePrice}} | ||
| 20 | + </template> | ||
| 21 | + </el-table-column> | ||
| 22 | + <el-table-column prop="additionalAmount" :label="$t('feeDetailConfig.additionalFee')" align="center"></el-table-column> | ||
| 23 | + <el-table-column :label="$t('feeDetailConfig.accountDeduction')" align="center"> | ||
| 24 | + <template slot-scope="scope"> | ||
| 25 | + {{scope.row.deductFrom == 'Y' ? $t('feeDetailConfig.yes') : $t('feeDetailConfig.no')}} | ||
| 26 | + </template> | ||
| 27 | + </el-table-column> | ||
| 28 | + <el-table-column :label="$t('feeDetailConfig.mobilePayment')" align="center"> | ||
| 29 | + <template slot-scope="scope"> | ||
| 30 | + {{scope.row.payOnline == 'Y' ? $t('feeDetailConfig.yes') : $t('feeDetailConfig.no')}} | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + <el-table-column prop="scale" :label="$t('feeDetailConfig.decimalPlaces')" align="center"></el-table-column> | ||
| 34 | + </el-table> | ||
| 35 | + | ||
| 36 | + <el-row class="margin-top"> | ||
| 37 | + <el-col :span="12"></el-col> | ||
| 38 | + <el-col :span="12"> | ||
| 39 | + <el-pagination | ||
| 40 | + @current-change="handleCurrentChange" | ||
| 41 | + :current-page="pagination.currentPage" | ||
| 42 | + :page-size="pagination.pageSize" | ||
| 43 | + layout="total, prev, pager, next" | ||
| 44 | + :total="pagination.total"> | ||
| 45 | + </el-pagination> | ||
| 46 | + </el-col> | ||
| 47 | + </el-row> | ||
| 48 | + </div> | ||
| 49 | + </div> | ||
| 50 | +</template> | ||
| 51 | + | ||
| 52 | +<script> | ||
| 53 | +import { listFeeConfigs } from '@/api/fee/feeDetailConfigApi' | ||
| 54 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 55 | + | ||
| 56 | +export default { | ||
| 57 | + name: 'FeeDetailConfig', | ||
| 58 | + data() { | ||
| 59 | + return { | ||
| 60 | + feeDetailConfigInfo: { | ||
| 61 | + feeConfigs: [], | ||
| 62 | + configId: '' | ||
| 63 | + }, | ||
| 64 | + pagination: { | ||
| 65 | + currentPage: 1, | ||
| 66 | + pageSize: 10, | ||
| 67 | + total: 0 | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + }, | ||
| 71 | + methods: { | ||
| 72 | + open(params) { | ||
| 73 | + this.feeDetailConfigInfo.configId = params.configId | ||
| 74 | + this._loadFeeDetailConfigData() | ||
| 75 | + }, | ||
| 76 | + _loadFeeDetailConfigData() { | ||
| 77 | + const params = { | ||
| 78 | + communityId: getCommunityId(), | ||
| 79 | + configId: this.feeDetailConfigInfo.configId, | ||
| 80 | + page: this.pagination.currentPage, | ||
| 81 | + row: this.pagination.pageSize | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + listFeeConfigs(params).then(res => { | ||
| 85 | + this.feeDetailConfigInfo.feeConfigs = res.feeConfigs | ||
| 86 | + this.pagination.total = res.records | ||
| 87 | + }).catch(error => { | ||
| 88 | + console.error('Failed to load fee config details:', error) | ||
| 89 | + }) | ||
| 90 | + }, | ||
| 91 | + handleCurrentChange(val) { | ||
| 92 | + this.pagination.currentPage = val | ||
| 93 | + this._loadFeeDetailConfigData() | ||
| 94 | + } | ||
| 95 | + } | ||
| 96 | +} | ||
| 97 | +</script> | ||
| 0 | \ No newline at end of file | 98 | \ No newline at end of file |
src/components/fee/feeDetailConfigDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailConfigDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-config ref="feeDetailConfig"></fee-detail-config> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailConfig from './feeDetailConfig' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailConfigDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailConfig | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailConfig.open({ | ||
| 19 | + configId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailContract.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table :data="feeDetailContractInfo.contracts" style="width: 100%"> | ||
| 5 | + <el-table-column prop="contractName" :label="$t('feeDetailContract.contractName')" align="center"></el-table-column> | ||
| 6 | + <el-table-column prop="contractCode" :label="$t('feeDetailContract.contractCode')" align="center"></el-table-column> | ||
| 7 | + <el-table-column :label="$t('feeDetailContract.parentContractCode')" align="center"> | ||
| 8 | + <template slot-scope="scope"> | ||
| 9 | + {{scope.row.parentContractCode ? scope.row.parentContractCode : '-'}} | ||
| 10 | + </template> | ||
| 11 | + </el-table-column> | ||
| 12 | + <el-table-column prop="contractTypeName" :label="$t('feeDetailContract.contractType')" align="center"></el-table-column> | ||
| 13 | + <el-table-column prop="operator" :label="$t('feeDetailContract.operator')" align="center"></el-table-column> | ||
| 14 | + <el-table-column prop="amount" :label="$t('feeDetailContract.contractAmount')" align="center"></el-table-column> | ||
| 15 | + <el-table-column prop="startTime" :label="$t('feeDetailContract.startTime')" align="center"></el-table-column> | ||
| 16 | + <el-table-column prop="endTime" :label="$t('feeDetailContract.endTime')" align="center"></el-table-column> | ||
| 17 | + <el-table-column prop="createTime" :label="$t('feeDetailContract.draftTime')" align="center"></el-table-column> | ||
| 18 | + <el-table-column prop="stateName" :label="$t('feeDetailContract.status')" align="center"></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="handleCurrentChange" | ||
| 26 | + :current-page="pagination.currentPage" | ||
| 27 | + :page-size="pagination.pageSize" | ||
| 28 | + layout="total, prev, pager, next" | ||
| 29 | + :total="pagination.total"> | ||
| 30 | + </el-pagination> | ||
| 31 | + </el-col> | ||
| 32 | + </el-row> | ||
| 33 | + </div> | ||
| 34 | + </div> | ||
| 35 | +</template> | ||
| 36 | + | ||
| 37 | +<script> | ||
| 38 | +import { queryContract } from '@/api/fee/feeDetailContractApi' | ||
| 39 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 40 | + | ||
| 41 | +export default { | ||
| 42 | + name: 'FeeDetailContract', | ||
| 43 | + data() { | ||
| 44 | + return { | ||
| 45 | + feeDetailContractInfo: { | ||
| 46 | + contracts: [], | ||
| 47 | + contractId: '' | ||
| 48 | + }, | ||
| 49 | + pagination: { | ||
| 50 | + currentPage: 1, | ||
| 51 | + pageSize: 10, | ||
| 52 | + total: 0 | ||
| 53 | + } | ||
| 54 | + } | ||
| 55 | + }, | ||
| 56 | + methods: { | ||
| 57 | + open(params) { | ||
| 58 | + this.feeDetailContractInfo.contractId = params.payerObjId | ||
| 59 | + this._loadFeeDetailContractData() | ||
| 60 | + }, | ||
| 61 | + _loadFeeDetailContractData() { | ||
| 62 | + const params = { | ||
| 63 | + communityId: getCommunityId(), | ||
| 64 | + contractId: this.feeDetailContractInfo.contractId, | ||
| 65 | + page: this.pagination.currentPage, | ||
| 66 | + row: this.pagination.pageSize | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + queryContract(params).then(res => { | ||
| 70 | + this.feeDetailContractInfo.contracts = res.data | ||
| 71 | + this.pagination.total = res.records | ||
| 72 | + }).catch(error => { | ||
| 73 | + console.error('Failed to load contract details:', error) | ||
| 74 | + }) | ||
| 75 | + }, | ||
| 76 | + handleCurrentChange(val) { | ||
| 77 | + this.pagination.currentPage = val | ||
| 78 | + this._loadFeeDetailContractData() | ||
| 79 | + } | ||
| 80 | + } | ||
| 81 | +} | ||
| 82 | +</script> | ||
| 0 | \ No newline at end of file | 83 | \ No newline at end of file |
src/components/fee/feeDetailContractDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailContractDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-contract ref="feeDetailContract"></fee-detail-contract> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailContract from './feeDetailContract' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailContractDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailContract | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailContract.open({ | ||
| 19 | + payerObjId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailDiscount.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table | ||
| 5 | + :data="feeDetailDiscountInfo.applyRoomDiscounts" | ||
| 6 | + border | ||
| 7 | + style="width: 100%" | ||
| 8 | + > | ||
| 9 | + <el-table-column | ||
| 10 | + prop="roomName" | ||
| 11 | + :label="$t('feeDetailDiscount.roomName')" | ||
| 12 | + align="center" | ||
| 13 | + ></el-table-column> | ||
| 14 | + <el-table-column | ||
| 15 | + prop="discountId" | ||
| 16 | + :label="$t('feeDetailDiscount.discountId')" | ||
| 17 | + align="center" | ||
| 18 | + ></el-table-column> | ||
| 19 | + <el-table-column | ||
| 20 | + prop="discountName" | ||
| 21 | + :label="$t('feeDetailDiscount.discountName')" | ||
| 22 | + align="center" | ||
| 23 | + ></el-table-column> | ||
| 24 | + <el-table-column | ||
| 25 | + prop="applyTypeName" | ||
| 26 | + :label="$t('feeDetailDiscount.applyType')" | ||
| 27 | + align="center" | ||
| 28 | + ></el-table-column> | ||
| 29 | + <el-table-column | ||
| 30 | + prop="createUserName" | ||
| 31 | + :label="$t('feeDetailDiscount.applicant')" | ||
| 32 | + align="center" | ||
| 33 | + ></el-table-column> | ||
| 34 | + <el-table-column | ||
| 35 | + prop="createUserTel" | ||
| 36 | + :label="$t('feeDetailDiscount.applicantPhone')" | ||
| 37 | + align="center" | ||
| 38 | + ></el-table-column> | ||
| 39 | + <el-table-column | ||
| 40 | + prop="startTime" | ||
| 41 | + :label="$t('feeDetailDiscount.startTime')" | ||
| 42 | + align="center" | ||
| 43 | + ></el-table-column> | ||
| 44 | + <el-table-column | ||
| 45 | + prop="endTime" | ||
| 46 | + :label="$t('feeDetailDiscount.endTime')" | ||
| 47 | + align="center" | ||
| 48 | + ></el-table-column> | ||
| 49 | + <el-table-column | ||
| 50 | + prop="stateName" | ||
| 51 | + :label="$t('feeDetailDiscount.status')" | ||
| 52 | + align="center" | ||
| 53 | + ></el-table-column> | ||
| 54 | + <el-table-column | ||
| 55 | + prop="createTime" | ||
| 56 | + :label="$t('feeDetailDiscount.createTime')" | ||
| 57 | + align="center" | ||
| 58 | + ></el-table-column> | ||
| 59 | + <el-table-column | ||
| 60 | + prop="inUse" | ||
| 61 | + :label="$t('feeDetailDiscount.useStatus')" | ||
| 62 | + align="center" | ||
| 63 | + > | ||
| 64 | + <template #default="{row}"> | ||
| 65 | + {{row.inUse === '0' ? $t('feeDetailDiscount.notUsed') : $t('feeDetailDiscount.used')}} | ||
| 66 | + </template> | ||
| 67 | + </el-table-column> | ||
| 68 | + <el-table-column | ||
| 69 | + :label="$t('feeDetailDiscount.returnType')" | ||
| 70 | + align="center" | ||
| 71 | + > | ||
| 72 | + <template #default="{row}"> | ||
| 73 | + <span v-if="row.discountId"> | ||
| 74 | + {{row.returnWay === '1002' ? $t('feeDetailDiscount.accountBalance') : $t('feeDetailDiscount.discount')}} | ||
| 75 | + </span> | ||
| 76 | + <span v-else>-</span> | ||
| 77 | + </template> | ||
| 78 | + </el-table-column> | ||
| 79 | + <el-table-column | ||
| 80 | + :label="$t('feeDetailDiscount.returnAmount')" | ||
| 81 | + align="center" | ||
| 82 | + > | ||
| 83 | + <template #default="{row}"> | ||
| 84 | + {{row.returnAmount ? row.returnAmount : '-'}} | ||
| 85 | + </template> | ||
| 86 | + </el-table-column> | ||
| 87 | + </el-table> | ||
| 88 | + | ||
| 89 | + <el-row class="margin-top"> | ||
| 90 | + <el-col :span="4"></el-col> | ||
| 91 | + <el-col :span="20"> | ||
| 92 | + <el-pagination | ||
| 93 | + @current-change="handleCurrentChange" | ||
| 94 | + :current-page="currentPage" | ||
| 95 | + :page-size="pageSize" | ||
| 96 | + layout="total, prev, pager, next, jumper" | ||
| 97 | + :total="total" | ||
| 98 | + ></el-pagination> | ||
| 99 | + </el-col> | ||
| 100 | + </el-row> | ||
| 101 | + </div> | ||
| 102 | + </div> | ||
| 103 | +</template> | ||
| 104 | + | ||
| 105 | +<script> | ||
| 106 | +import { queryApplyRoomDiscount } from '@/api/fee/feeDetailDiscountApi' | ||
| 107 | + | ||
| 108 | +export default { | ||
| 109 | + name: 'FeeDetailDiscount', | ||
| 110 | + data() { | ||
| 111 | + return { | ||
| 112 | + feeDetailDiscountInfo: { | ||
| 113 | + applyRoomDiscounts: [], | ||
| 114 | + feeId: '' | ||
| 115 | + }, | ||
| 116 | + currentPage: 1, | ||
| 117 | + pageSize: 10, | ||
| 118 | + total: 0 | ||
| 119 | + } | ||
| 120 | + }, | ||
| 121 | + methods: { | ||
| 122 | + open(params) { | ||
| 123 | + this.feeDetailDiscountInfo.feeId = params.feeId | ||
| 124 | + this._loadFeeDetailDiscountData(this.currentPage, this.pageSize) | ||
| 125 | + }, | ||
| 126 | + handleCurrentChange(val) { | ||
| 127 | + this.currentPage = val | ||
| 128 | + this._loadFeeDetailDiscountData(this.currentPage, this.pageSize) | ||
| 129 | + }, | ||
| 130 | + async _loadFeeDetailDiscountData(page, row) { | ||
| 131 | + try { | ||
| 132 | + const params = { | ||
| 133 | + communityId: this.$store.getters.communityId, | ||
| 134 | + feeId: this.feeDetailDiscountInfo.feeId, | ||
| 135 | + page, | ||
| 136 | + row | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + const res = await queryApplyRoomDiscount(params) | ||
| 140 | + this.feeDetailDiscountInfo.applyRoomDiscounts = res.data | ||
| 141 | + this.total = res.records | ||
| 142 | + } catch (error) { | ||
| 143 | + console.error('Failed to load discount data:', error) | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | +} | ||
| 148 | +</script> | ||
| 0 | \ No newline at end of file | 149 | \ No newline at end of file |
src/components/fee/feeDetailDiscountDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailDiscountDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-discount ref="feeDetailDiscount"></fee-detail-discount> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailDiscount from './feeDetailDiscount' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailDiscountDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailDiscount | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailDiscount.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailHis.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row class="margin-top"> | ||
| 4 | + <el-col :span="24" class="text-right"></el-col> | ||
| 5 | + </el-row> | ||
| 6 | + <div class="margin-top"> | ||
| 7 | + <el-table | ||
| 8 | + :data="feeDetailHisInfo.fees" | ||
| 9 | + border | ||
| 10 | + style="width: 100%" | ||
| 11 | + > | ||
| 12 | + <el-table-column | ||
| 13 | + prop="feeName" | ||
| 14 | + :label="$t('feeDetailHis.feeName')" | ||
| 15 | + align="center" | ||
| 16 | + > | ||
| 17 | + <template #default="{row}"> | ||
| 18 | + {{row.feeName}} | ||
| 19 | + <span v-if="row.payerObjName">({{row.payerObjName}})</span> | ||
| 20 | + </template> | ||
| 21 | + </el-table-column> | ||
| 22 | + <el-table-column | ||
| 23 | + prop="startTime" | ||
| 24 | + :label="$t('feeDetailHis.startTime')" | ||
| 25 | + align="center" | ||
| 26 | + ></el-table-column> | ||
| 27 | + <el-table-column | ||
| 28 | + prop="endTime" | ||
| 29 | + :label="$t('feeDetailHis.endTime')" | ||
| 30 | + align="center" | ||
| 31 | + ></el-table-column> | ||
| 32 | + <el-table-column | ||
| 33 | + :label="$t('feeDetailHis.operation')" | ||
| 34 | + align="center" | ||
| 35 | + > | ||
| 36 | + <template #default="{row}"> | ||
| 37 | + {{_getFeeHisOperate(row)}} | ||
| 38 | + </template> | ||
| 39 | + </el-table-column> | ||
| 40 | + <el-table-column | ||
| 41 | + prop="userName" | ||
| 42 | + :label="$t('feeDetailHis.operator')" | ||
| 43 | + align="center" | ||
| 44 | + ></el-table-column> | ||
| 45 | + <el-table-column | ||
| 46 | + prop="createTime" | ||
| 47 | + :label="$t('feeDetailHis.operationTime')" | ||
| 48 | + align="center" | ||
| 49 | + ></el-table-column> | ||
| 50 | + </el-table> | ||
| 51 | + | ||
| 52 | + <el-row class="margin-top"> | ||
| 53 | + <el-col :span="4"></el-col> | ||
| 54 | + <el-col :span="20"> | ||
| 55 | + <el-pagination | ||
| 56 | + @current-change="handleCurrentChange" | ||
| 57 | + :current-page="currentPage" | ||
| 58 | + :page-size="pageSize" | ||
| 59 | + layout="total, prev, pager, next, jumper" | ||
| 60 | + :total="total" | ||
| 61 | + ></el-pagination> | ||
| 62 | + </el-col> | ||
| 63 | + </el-row> | ||
| 64 | + </div> | ||
| 65 | + </div> | ||
| 66 | +</template> | ||
| 67 | + | ||
| 68 | +<script> | ||
| 69 | +import { queryHisFee } from '@/api/fee/feeDetailHisApi' | ||
| 70 | + | ||
| 71 | +export default { | ||
| 72 | + name: 'FeeDetailHis', | ||
| 73 | + data() { | ||
| 74 | + return { | ||
| 75 | + feeDetailHisInfo: { | ||
| 76 | + fees: [], | ||
| 77 | + feeId: '', | ||
| 78 | + staffNameLike: '', | ||
| 79 | + feeNameLike: '', | ||
| 80 | + payerObjName: '', | ||
| 81 | + logStartTime: '', | ||
| 82 | + logEndTime: '' | ||
| 83 | + }, | ||
| 84 | + currentPage: 1, | ||
| 85 | + pageSize: 10, | ||
| 86 | + total: 0 | ||
| 87 | + } | ||
| 88 | + }, | ||
| 89 | + methods: { | ||
| 90 | + open(params) { | ||
| 91 | + this.feeDetailHisInfo = Object.assign(this.feeDetailHisInfo, params) | ||
| 92 | + this._loadFeeDetailHisData(this.currentPage, this.pageSize) | ||
| 93 | + }, | ||
| 94 | + handleCurrentChange(val) { | ||
| 95 | + this.currentPage = val | ||
| 96 | + this._loadFeeDetailHisData(this.currentPage, this.pageSize) | ||
| 97 | + }, | ||
| 98 | + async _loadFeeDetailHisData(page, row) { | ||
| 99 | + try { | ||
| 100 | + const params = { | ||
| 101 | + communityId: this.$store.getters.communityId, | ||
| 102 | + feeId: this.feeDetailHisInfo.feeId, | ||
| 103 | + staffNameLike: this.feeDetailHisInfo.staffNameLike, | ||
| 104 | + feeNameLike: this.feeDetailHisInfo.feeNameLike, | ||
| 105 | + payerObjName: this.feeDetailHisInfo.payerObjName, | ||
| 106 | + logStartTime: this.feeDetailHisInfo.logStartTime, | ||
| 107 | + logEndTime: this.feeDetailHisInfo.logEndTime, | ||
| 108 | + page, | ||
| 109 | + row | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + const res = await queryHisFee(params) | ||
| 113 | + this.feeDetailHisInfo.fees = res.data | ||
| 114 | + this.total = res.records | ||
| 115 | + } catch (error) { | ||
| 116 | + console.error('Failed to load fee history data:', error) | ||
| 117 | + } | ||
| 118 | + }, | ||
| 119 | + _getFeeHisOperate(fee) { | ||
| 120 | + let feeCount = 0 | ||
| 121 | + this.feeDetailHisInfo.fees.forEach(item => { | ||
| 122 | + if (fee.bId === item.bId) { | ||
| 123 | + feeCount += 1 | ||
| 124 | + } | ||
| 125 | + }) | ||
| 126 | + | ||
| 127 | + if (feeCount <= 1) { | ||
| 128 | + if (fee.operate === 'ADD') return this.$t('feeDetailHis.add') | ||
| 129 | + if (fee.operate === 'DEL') return this.$t('feeDetailHis.delete') | ||
| 130 | + return '-' | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + if (fee.operate === 'ADD') return this.$t('feeDetailHis.modifyNew') | ||
| 134 | + if (fee.operate === 'DEL') return this.$t('feeDetailHis.modifyOld') | ||
| 135 | + return '-' | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | +} | ||
| 139 | +</script> | ||
| 0 | \ No newline at end of file | 140 | \ No newline at end of file |
src/components/fee/feeDetailHisDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailHisDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-his ref="feeDetailHis"></fee-detail-his> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailHis from './feeDetailHis' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailHisDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailHis | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailHis.open({ | ||
| 19 | + feeId: '123', | ||
| 20 | + staffNameLike: '', | ||
| 21 | + feeNameLike: '', | ||
| 22 | + payerObjName: '', | ||
| 23 | + logStartTime: '', | ||
| 24 | + logEndTime: '' | ||
| 25 | + }) | ||
| 26 | + } | ||
| 27 | + } | ||
| 28 | +} | ||
| 29 | +</script> | ||
| 0 | \ No newline at end of file | 30 | \ No newline at end of file |
src/components/fee/feeDetailHisFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row> | ||
| 4 | + <el-col :span="24" class="text-right"></el-col> | ||
| 5 | + </el-row> | ||
| 6 | + | ||
| 7 | + <div class="margin-top"> | ||
| 8 | + <el-table :data="feeDetailHisFeeInfo.feeDetails" style="width: 100%"> | ||
| 9 | + <el-table-column prop="feeName" :label="$t('feeDetailHisFee.feeName')" align="center"></el-table-column> | ||
| 10 | + <el-table-column prop="payerObjName" :label="$t('feeDetailHisFee.payerObjName')" | ||
| 11 | + align="center"></el-table-column> | ||
| 12 | + <el-table-column prop="cycles" :label="$t('feeDetailHisFee.cycles')" align="center"></el-table-column> | ||
| 13 | + <el-table-column :label="$t('feeDetailHisFee.amount')" align="center"> | ||
| 14 | + <template slot-scope="scope"> | ||
| 15 | + {{ scope.row.receivableAmount }}/{{ scope.row.receivedAmount }}<br> | ||
| 16 | + <div v-if="scope.row.acctAmount > 0"> | ||
| 17 | + {{ $t('feeDetailHisFee.accountDeduction') }}: {{ scope.row.acctAmount }}<br> | ||
| 18 | + </div> | ||
| 19 | + <div v-for="(item, index) in scope.row.payFeeDetailDiscountDtoList" :key="index"> | ||
| 20 | + {{ item.discountName }}: {{ Math.abs(item.discountPrice) }}<br> | ||
| 21 | + </div> | ||
| 22 | + </template> | ||
| 23 | + </el-table-column> | ||
| 24 | + <el-table-column prop="primeRateName" :label="$t('feeDetailHisFee.paymentMethod')" | ||
| 25 | + align="center"></el-table-column> | ||
| 26 | + <el-table-column :label="$t('feeDetailHisFee.paymentPeriod')" align="center"> | ||
| 27 | + <template slot-scope="scope"> | ||
| 28 | + {{ dateFormat(scope.row.startTime) }}~<br> | ||
| 29 | + {{ dateFormat(scope.row.endTime) }} | ||
| 30 | + </template> | ||
| 31 | + </el-table-column> | ||
| 32 | + <el-table-column prop="createTime" :label="$t('feeDetailHisFee.paymentTime')" align="center"></el-table-column> | ||
| 33 | + <el-table-column prop="cashierName" :label="$t('feeDetailHisFee.cashier')" align="center"> | ||
| 34 | + <template slot-scope="scope">{{ scope.row.cashierName || '-' }}</template> | ||
| 35 | + </el-table-column> | ||
| 36 | + <el-table-column prop="stateName" :label="$t('feeDetailHisFee.status')" align="center"></el-table-column> | ||
| 37 | + <el-table-column prop="remark" :label="$t('feeDetailHisFee.remark')" align="center"></el-table-column> | ||
| 38 | + <el-table-column :label="$t('feeDetailHisFee.operation')" align="center"> | ||
| 39 | + <template slot-scope="scope"> | ||
| 40 | + <el-button v-if="scope.row.state == '1400' || scope.row.state == '1200' || scope.row.state == ''" size="mini" | ||
| 41 | + @click="_toRefundFee(scope.row)"> | ||
| 42 | + {{ $t('feeDetailHisFee.detail') }} | ||
| 43 | + </el-button> | ||
| 44 | + </template> | ||
| 45 | + </el-table-column> | ||
| 46 | + </el-table> | ||
| 47 | + | ||
| 48 | + <el-row class="margin-top"> | ||
| 49 | + <el-col :span="12"></el-col> | ||
| 50 | + <el-col :span="12"> | ||
| 51 | + <el-pagination @current-change="handleCurrentChange" :current-page="pagination.currentPage" | ||
| 52 | + :page-size="pagination.pageSize" layout="total, prev, pager, next" :total="pagination.total"> | ||
| 53 | + </el-pagination> | ||
| 54 | + </el-col> | ||
| 55 | + </el-row> | ||
| 56 | + </div> | ||
| 57 | + </div> | ||
| 58 | +</template> | ||
| 59 | + | ||
| 60 | +<script> | ||
| 61 | +import { queryFeeDetail } from '@/api/fee/feeDetailHisFeeApi' | ||
| 62 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 63 | + | ||
| 64 | +export default { | ||
| 65 | + name: 'FeeDetailHisFee', | ||
| 66 | + data() { | ||
| 67 | + return { | ||
| 68 | + feeDetailHisFeeInfo: { | ||
| 69 | + feeDetails: [], | ||
| 70 | + feeId: '' | ||
| 71 | + }, | ||
| 72 | + pagination: { | ||
| 73 | + currentPage: 1, | ||
| 74 | + pageSize: 10, | ||
| 75 | + total: 0 | ||
| 76 | + } | ||
| 77 | + } | ||
| 78 | + }, | ||
| 79 | + methods: { | ||
| 80 | + open(params) { | ||
| 81 | + this.feeDetailHisFeeInfo.feeId = params.feeId | ||
| 82 | + this._loadFeeDetailHisFeeData() | ||
| 83 | + }, | ||
| 84 | + _loadFeeDetailHisFeeData() { | ||
| 85 | + const params = { | ||
| 86 | + communityId: getCommunityId(), | ||
| 87 | + feeId: this.feeDetailHisFeeInfo.feeId, | ||
| 88 | + page: this.pagination.currentPage, | ||
| 89 | + row: this.pagination.pageSize | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + queryFeeDetail(params).then(res => { | ||
| 93 | + this.feeDetailHisFeeInfo.feeDetails = res.feeDetails | ||
| 94 | + this.pagination.total = res.records | ||
| 95 | + }).catch(error => { | ||
| 96 | + console.error('Failed to load fee detail history:', error) | ||
| 97 | + }) | ||
| 98 | + }, | ||
| 99 | + handleCurrentChange(val) { | ||
| 100 | + this.pagination.currentPage = val | ||
| 101 | + this._loadFeeDetailHisFeeData() | ||
| 102 | + }, | ||
| 103 | + _toRefundFee(detail) { | ||
| 104 | + this.$router.push(`/pages/property/propertyFee?feeId=${detail.feeId}`) | ||
| 105 | + }, | ||
| 106 | + dateFormat(date) { | ||
| 107 | + return this.$moment(date).format('YYYY-MM-DD') | ||
| 108 | + } | ||
| 109 | + } | ||
| 110 | +} | ||
| 111 | +</script> | ||
| 0 | \ No newline at end of file | 112 | \ No newline at end of file |
src/components/fee/feeDetailHisFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailHisFeeDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-his-fee ref="feeDetailHisFee"></fee-detail-his-fee> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailHisFee from './feeDetailHisFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailHisFeeDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailHisFee | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailHisFee.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailImport.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table | ||
| 5 | + :data="feeDetailImportInfo.importFeeDetails" | ||
| 6 | + border | ||
| 7 | + style="width: 100%" | ||
| 8 | + > | ||
| 9 | + <el-table-column | ||
| 10 | + prop="floorNum" | ||
| 11 | + :label="$t('feeDetailImport.floorNum')" | ||
| 12 | + align="center" | ||
| 13 | + ></el-table-column> | ||
| 14 | + <el-table-column | ||
| 15 | + prop="unitNum" | ||
| 16 | + :label="$t('feeDetailImport.unitNum')" | ||
| 17 | + align="center" | ||
| 18 | + ></el-table-column> | ||
| 19 | + <el-table-column | ||
| 20 | + prop="roomNum" | ||
| 21 | + :label="$t('feeDetailImport.roomNum')" | ||
| 22 | + align="center" | ||
| 23 | + ></el-table-column> | ||
| 24 | + <el-table-column | ||
| 25 | + prop="feeName" | ||
| 26 | + :label="$t('feeDetailImport.feeName')" | ||
| 27 | + align="center" | ||
| 28 | + ></el-table-column> | ||
| 29 | + <el-table-column | ||
| 30 | + prop="startTime" | ||
| 31 | + :label="$t('feeDetailImport.startTime')" | ||
| 32 | + align="center" | ||
| 33 | + ></el-table-column> | ||
| 34 | + <el-table-column | ||
| 35 | + prop="endTime" | ||
| 36 | + :label="$t('feeDetailImport.endTime')" | ||
| 37 | + align="center" | ||
| 38 | + ></el-table-column> | ||
| 39 | + <el-table-column | ||
| 40 | + prop="amount" | ||
| 41 | + :label="$t('feeDetailImport.totalAmount')" | ||
| 42 | + align="center" | ||
| 43 | + ></el-table-column> | ||
| 44 | + <el-table-column | ||
| 45 | + prop="remark" | ||
| 46 | + :label="$t('feeDetailImport.remark')" | ||
| 47 | + align="center" | ||
| 48 | + ></el-table-column> | ||
| 49 | + <el-table-column | ||
| 50 | + prop="state" | ||
| 51 | + :label="$t('feeDetailImport.status')" | ||
| 52 | + align="center" | ||
| 53 | + > | ||
| 54 | + <template #default="{row}"> | ||
| 55 | + <el-tag :type="row.state === '1000' ? 'success' : 'danger'"> | ||
| 56 | + {{row.state === '1000' ? $t('feeDetailImport.importSuccess') : $t('feeDetailImport.importFailed')}} | ||
| 57 | + </el-tag> | ||
| 58 | + </template> | ||
| 59 | + </el-table-column> | ||
| 60 | + </el-table> | ||
| 61 | + | ||
| 62 | + <el-row class="margin-top"> | ||
| 63 | + <el-col :span="4"></el-col> | ||
| 64 | + <el-col :span="20"> | ||
| 65 | + <el-pagination | ||
| 66 | + @current-change="handleCurrentChange" | ||
| 67 | + :current-page="currentPage" | ||
| 68 | + :page-size="pageSize" | ||
| 69 | + layout="total, prev, pager, next, jumper" | ||
| 70 | + :total="total" | ||
| 71 | + ></el-pagination> | ||
| 72 | + </el-col> | ||
| 73 | + </el-row> | ||
| 74 | + </div> | ||
| 75 | + </div> | ||
| 76 | +</template> | ||
| 77 | + | ||
| 78 | +<script> | ||
| 79 | +import { queryImportFeeDetail } from '@/api/fee/feeDetailImportApi' | ||
| 80 | + | ||
| 81 | +export default { | ||
| 82 | + name: 'FeeDetailImport', | ||
| 83 | + data() { | ||
| 84 | + return { | ||
| 85 | + feeDetailImportInfo: { | ||
| 86 | + importFeeDetails: [], | ||
| 87 | + feeId: '' | ||
| 88 | + }, | ||
| 89 | + currentPage: 1, | ||
| 90 | + pageSize: 10, | ||
| 91 | + total: 0 | ||
| 92 | + } | ||
| 93 | + }, | ||
| 94 | + methods: { | ||
| 95 | + open(params) { | ||
| 96 | + this.feeDetailImportInfo.feeId = params.feeId | ||
| 97 | + this._loadFeeDetailImportData(this.currentPage, this.pageSize) | ||
| 98 | + }, | ||
| 99 | + handleCurrentChange(val) { | ||
| 100 | + this.currentPage = val | ||
| 101 | + this._loadFeeDetailImportData(this.currentPage, this.pageSize) | ||
| 102 | + }, | ||
| 103 | + async _loadFeeDetailImportData(page, row) { | ||
| 104 | + try { | ||
| 105 | + const params = { | ||
| 106 | + communityId: this.$store.getters.communityId, | ||
| 107 | + feeId: this.feeDetailImportInfo.feeId, | ||
| 108 | + page, | ||
| 109 | + row | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + const res = await queryImportFeeDetail(params) | ||
| 113 | + this.feeDetailImportInfo.importFeeDetails = res.data | ||
| 114 | + this.total = res.records | ||
| 115 | + } catch (error) { | ||
| 116 | + console.error('Failed to load import fee data:', error) | ||
| 117 | + } | ||
| 118 | + } | ||
| 119 | + } | ||
| 120 | +} | ||
| 121 | +</script> | ||
| 0 | \ No newline at end of file | 122 | \ No newline at end of file |
src/components/fee/feeDetailImportDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailImportDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-import ref="feeDetailImport"></fee-detail-import> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailImport from './feeDetailImport' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailImportDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailImport | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailImport.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailMeter.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table | ||
| 5 | + :data="feeDetailMeterInfo.meterWaters" | ||
| 6 | + border | ||
| 7 | + style="width: 100%" | ||
| 8 | + > | ||
| 9 | + <el-table-column | ||
| 10 | + prop="waterId" | ||
| 11 | + :label="$t('feeDetailMeter.meterId')" | ||
| 12 | + align="center" | ||
| 13 | + ></el-table-column> | ||
| 14 | + <el-table-column | ||
| 15 | + prop="meterTypeName" | ||
| 16 | + :label="$t('feeDetailMeter.meterType')" | ||
| 17 | + align="center" | ||
| 18 | + ></el-table-column> | ||
| 19 | + <el-table-column | ||
| 20 | + prop="objName" | ||
| 21 | + :label="$t('feeDetailMeter.objName')" | ||
| 22 | + align="center" | ||
| 23 | + ></el-table-column> | ||
| 24 | + <el-table-column | ||
| 25 | + prop="preDegrees" | ||
| 26 | + :label="$t('feeDetailMeter.preDegrees')" | ||
| 27 | + align="center" | ||
| 28 | + ></el-table-column> | ||
| 29 | + <el-table-column | ||
| 30 | + prop="curDegrees" | ||
| 31 | + :label="$t('feeDetailMeter.curDegrees')" | ||
| 32 | + align="center" | ||
| 33 | + ></el-table-column> | ||
| 34 | + <el-table-column | ||
| 35 | + prop="preReadingTime" | ||
| 36 | + :label="$t('feeDetailMeter.preReadingTime')" | ||
| 37 | + align="center" | ||
| 38 | + ></el-table-column> | ||
| 39 | + <el-table-column | ||
| 40 | + prop="curReadingTime" | ||
| 41 | + :label="$t('feeDetailMeter.curReadingTime')" | ||
| 42 | + align="center" | ||
| 43 | + ></el-table-column> | ||
| 44 | + <el-table-column | ||
| 45 | + prop="createTime" | ||
| 46 | + :label="$t('feeDetailMeter.createTime')" | ||
| 47 | + align="center" | ||
| 48 | + ></el-table-column> | ||
| 49 | + </el-table> | ||
| 50 | + | ||
| 51 | + <el-row class="margin-top"> | ||
| 52 | + <el-col :span="4"></el-col> | ||
| 53 | + <el-col :span="20"> | ||
| 54 | + <el-pagination | ||
| 55 | + @current-change="handleCurrentChange" | ||
| 56 | + :current-page="currentPage" | ||
| 57 | + :page-size="pageSize" | ||
| 58 | + layout="total, prev, pager, next, jumper" | ||
| 59 | + :total="total" | ||
| 60 | + ></el-pagination> | ||
| 61 | + </el-col> | ||
| 62 | + </el-row> | ||
| 63 | + </div> | ||
| 64 | + </div> | ||
| 65 | +</template> | ||
| 66 | + | ||
| 67 | +<script> | ||
| 68 | +import { listMeterWaters } from '@/api/fee/feeDetailMeterApi' | ||
| 69 | + | ||
| 70 | +export default { | ||
| 71 | + name: 'FeeDetailMeter', | ||
| 72 | + data() { | ||
| 73 | + return { | ||
| 74 | + feeDetailMeterInfo: { | ||
| 75 | + meterWaters: [], | ||
| 76 | + feeId: '' | ||
| 77 | + }, | ||
| 78 | + currentPage: 1, | ||
| 79 | + pageSize: 10, | ||
| 80 | + total: 0 | ||
| 81 | + } | ||
| 82 | + }, | ||
| 83 | + methods: { | ||
| 84 | + open(params) { | ||
| 85 | + this.feeDetailMeterInfo.feeId = params.feeId | ||
| 86 | + this._loadFeeDetailMeterData(this.currentPage, this.pageSize) | ||
| 87 | + }, | ||
| 88 | + handleCurrentChange(val) { | ||
| 89 | + this.currentPage = val | ||
| 90 | + this._loadFeeDetailMeterData(this.currentPage, this.pageSize) | ||
| 91 | + }, | ||
| 92 | + async _loadFeeDetailMeterData(page, row) { | ||
| 93 | + try { | ||
| 94 | + const params = { | ||
| 95 | + communityId: this.$store.getters.communityId, | ||
| 96 | + feeId: this.feeDetailMeterInfo.feeId, | ||
| 97 | + page, | ||
| 98 | + row | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + const res = await listMeterWaters(params) | ||
| 102 | + this.feeDetailMeterInfo.meterWaters = res.data | ||
| 103 | + this.total = res.records | ||
| 104 | + } catch (error) { | ||
| 105 | + console.error('Failed to load meter data:', error) | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | +} | ||
| 110 | +</script> | ||
| 0 | \ No newline at end of file | 111 | \ No newline at end of file |
src/components/fee/feeDetailMeterDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailMeterDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-meter ref="feeDetailMeter"></fee-detail-meter> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailMeter from './feeDetailMeter' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailMeterDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailMeter | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailMeter.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailMonthFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row> | ||
| 4 | + <el-col :span="24" class="text-right"></el-col> | ||
| 5 | + </el-row> | ||
| 6 | + | ||
| 7 | + <div class="margin-top"> | ||
| 8 | + <el-table :data="feeDetailMonthFeeInfo.monthFees" style="width: 100%"> | ||
| 9 | + <el-table-column prop="feeName" :label="$t('feeDetailMonthFee.feeItem')" align="center"></el-table-column> | ||
| 10 | + <el-table-column prop="feeFlagName" :label="$t('feeDetailMonthFee.feeFlag')" align="center"></el-table-column> | ||
| 11 | + <el-table-column prop="feeTypeCdName" :label="$t('feeDetailMonthFee.feeType')" align="center"></el-table-column> | ||
| 12 | + <el-table-column :label="$t('feeDetailMonthFee.chargeYearMonth')" align="center"> | ||
| 13 | + <template slot-scope="scope">{{scope.row.detailYear}}-{{scope.row.detailMonth}}</template> | ||
| 14 | + </el-table-column> | ||
| 15 | + <el-table-column prop="receivableAmount" :label="$t('feeDetailMonthFee.receivableAmount')" align="center"></el-table-column> | ||
| 16 | + <el-table-column :label="$t('feeDetailMonthFee.description')" align="center"> | ||
| 17 | + <template slot-scope="scope"> | ||
| 18 | + <div v-if="scope.row.computingFormula == '5005' || scope.row.computingFormula == '9009'"> | ||
| 19 | + <div> | ||
| 20 | + <span>{{$t('feeDetailMonthFee.lastDegrees')}}</span>{{scope.row.preDegrees}} | ||
| 21 | + </div> | ||
| 22 | + <div> | ||
| 23 | + <span>{{$t('feeDetailMonthFee.currentDegrees')}}</span>{{scope.row.curDegrees}} | ||
| 24 | + </div> | ||
| 25 | + <div> | ||
| 26 | + <span>{{$t('feeDetailMonthFee.unitPrice')}}</span>{{getOnePrice1(scope.row)}} | ||
| 27 | + </div> | ||
| 28 | + <div> | ||
| 29 | + <span>{{$t('feeDetailMonthFee.additionalFee')}}</span>{{scope.row.additionalAmount}} | ||
| 30 | + </div> | ||
| 31 | + </div> | ||
| 32 | + <div v-else-if="scope.row.computingFormula == '6006'"> | ||
| 33 | + <div> | ||
| 34 | + <span>{{$t('feeDetailMonthFee.usage')}}</span>{{_getAttrValue(scope.row.feeAttrs,'390006')}} | ||
| 35 | + </div> | ||
| 36 | + <div> | ||
| 37 | + <span>{{$t('feeDetailMonthFee.unitPrice')}}</span>{{scope.row.squarePrice}} | ||
| 38 | + </div> | ||
| 39 | + <div> | ||
| 40 | + <span>{{$t('feeDetailMonthFee.additionalFee')}}</span>{{scope.row.additionalAmount}} | ||
| 41 | + </div> | ||
| 42 | + </div> | ||
| 43 | + <div v-else-if="scope.row.feeTypeCd == '888800010017'" width="150"> | ||
| 44 | + <div> | ||
| 45 | + <span>{{$t('feeDetailMonthFee.algorithm')}}</span>{{_getAttrValue(scope.row.feeAttrs,'390005')}} | ||
| 46 | + </div> | ||
| 47 | + <div> | ||
| 48 | + <span>{{$t('feeDetailMonthFee.usage')}}</span>{{_getAttrValue(scope.row.feeAttrs,'390003')}} | ||
| 49 | + </div> | ||
| 50 | + </div> | ||
| 51 | + <div v-else> | ||
| 52 | + <div> | ||
| 53 | + <span>{{$t('feeDetailMonthFee.unitPrice')}}</span>{{scope.row.squarePrice}} | ||
| 54 | + </div> | ||
| 55 | + <div v-if="scope.row.feeFlag == '1003006'"> | ||
| 56 | + <span>{{$t('feeDetailMonthFee.additionalFee')}}</span>{{scope.row.additionalAmount}} | ||
| 57 | + </div> | ||
| 58 | + <div v-else> | ||
| 59 | + <span>{{$t('feeDetailMonthFee.fixedFee')}}</span>{{scope.row.additionalAmount}} | ||
| 60 | + </div> | ||
| 61 | + </div> | ||
| 62 | + </template> | ||
| 63 | + </el-table-column> | ||
| 64 | + </el-table> | ||
| 65 | + | ||
| 66 | + <el-row class="margin-top"> | ||
| 67 | + <el-col :span="12"></el-col> | ||
| 68 | + <el-col :span="12"> | ||
| 69 | + <el-pagination | ||
| 70 | + @current-change="handleCurrentChange" | ||
| 71 | + :current-page="pagination.currentPage" | ||
| 72 | + :page-size="pagination.pageSize" | ||
| 73 | + layout="total, prev, pager, next" | ||
| 74 | + :total="pagination.total"> | ||
| 75 | + </el-pagination> | ||
| 76 | + </el-col> | ||
| 77 | + </el-row> | ||
| 78 | + </div> | ||
| 79 | + </div> | ||
| 80 | +</template> | ||
| 81 | + | ||
| 82 | +<script> | ||
| 83 | +import { listMonthFee } from '@/api/fee/feeDetailMonthFeeApi' | ||
| 84 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 85 | + | ||
| 86 | +export default { | ||
| 87 | + name: 'FeeDetailMonthFee', | ||
| 88 | + data() { | ||
| 89 | + return { | ||
| 90 | + feeDetailMonthFeeInfo: { | ||
| 91 | + monthFees: [], | ||
| 92 | + feeId: '' | ||
| 93 | + }, | ||
| 94 | + pagination: { | ||
| 95 | + currentPage: 1, | ||
| 96 | + pageSize: 10, | ||
| 97 | + total: 0 | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + }, | ||
| 101 | + methods: { | ||
| 102 | + open(params) { | ||
| 103 | + this.feeDetailMonthFeeInfo.feeId = params.feeId | ||
| 104 | + this._loadFeeDetailMonthFeeData() | ||
| 105 | + }, | ||
| 106 | + _loadFeeDetailMonthFeeData() { | ||
| 107 | + const params = { | ||
| 108 | + communityId: getCommunityId(), | ||
| 109 | + feeId: this.feeDetailMonthFeeInfo.feeId, | ||
| 110 | + detailId: '-1', | ||
| 111 | + page: this.pagination.currentPage, | ||
| 112 | + row: this.pagination.pageSize | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + listMonthFee(params).then(res => { | ||
| 116 | + this.feeDetailMonthFeeInfo.monthFees = res.data | ||
| 117 | + this.pagination.total = res.records | ||
| 118 | + }).catch(error => { | ||
| 119 | + console.error('Failed to load month fee details:', error) | ||
| 120 | + }) | ||
| 121 | + }, | ||
| 122 | + handleCurrentChange(val) { | ||
| 123 | + this.pagination.currentPage = val | ||
| 124 | + this._loadFeeDetailMonthFeeData() | ||
| 125 | + }, | ||
| 126 | + getOnePrice1(fee) { | ||
| 127 | + // Implement your logic here | ||
| 128 | + return fee.squarePrice || '-' | ||
| 129 | + }, | ||
| 130 | + _getAttrValue(attrs, code) { | ||
| 131 | + if (!attrs) return '-' | ||
| 132 | + const attr = attrs.find(item => item.specCd === code) | ||
| 133 | + return attr ? attr.value : '-' | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | +} | ||
| 137 | +</script> | ||
| 0 | \ No newline at end of file | 138 | \ No newline at end of file |
src/components/fee/feeDetailMonthFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailMonthFeeDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-month-fee ref="feeDetailMonthFee"></fee-detail-month-fee> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailMonthFee from './feeDetailMonthFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailMonthFeeDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailMonthFee | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailMonthFee.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailOwner.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table | ||
| 5 | + :data="feeDetailOwnerInfo.owners" | ||
| 6 | + border | ||
| 7 | + style="width: 100%" | ||
| 8 | + > | ||
| 9 | + <el-table-column | ||
| 10 | + :label="$t('feeDetailOwner.ownerFace')" | ||
| 11 | + align="center" | ||
| 12 | + > | ||
| 13 | + <template #default="{row}"> | ||
| 14 | + <el-image | ||
| 15 | + style="width: 60px; height: 60px;" | ||
| 16 | + class="border-radius" | ||
| 17 | + :src="row.url || '/img/noPhoto.jpg'" | ||
| 18 | + :preview-src-list="[row.url]" | ||
| 19 | + v-if="row.url" | ||
| 20 | + ></el-image> | ||
| 21 | + <el-image | ||
| 22 | + style="width: 60px; height: 60px;" | ||
| 23 | + class="border-radius" | ||
| 24 | + src="/img/noPhoto.jpg" | ||
| 25 | + v-else | ||
| 26 | + ></el-image> | ||
| 27 | + </template> | ||
| 28 | + </el-table-column> | ||
| 29 | + <el-table-column | ||
| 30 | + prop="name" | ||
| 31 | + :label="$t('feeDetailOwner.name')" | ||
| 32 | + align="center" | ||
| 33 | + > | ||
| 34 | + <template #default="{row}"> | ||
| 35 | + {{row.name}}({{row.link}}) | ||
| 36 | + </template> | ||
| 37 | + </el-table-column> | ||
| 38 | + <el-table-column | ||
| 39 | + prop="sex" | ||
| 40 | + :label="$t('feeDetailOwner.gender')" | ||
| 41 | + align="center" | ||
| 42 | + > | ||
| 43 | + <template #default="{row}"> | ||
| 44 | + {{row.sex === 0 ? $t('feeDetailOwner.male') : $t('feeDetailOwner.female')}} | ||
| 45 | + </template> | ||
| 46 | + </el-table-column> | ||
| 47 | + <el-table-column | ||
| 48 | + prop="idCard" | ||
| 49 | + :label="$t('feeDetailOwner.idCard')" | ||
| 50 | + align="center" | ||
| 51 | + ></el-table-column> | ||
| 52 | + <el-table-column | ||
| 53 | + prop="address" | ||
| 54 | + :label="$t('feeDetailOwner.address')" | ||
| 55 | + align="center" | ||
| 56 | + ></el-table-column> | ||
| 57 | + <el-table-column | ||
| 58 | + prop="roomCount" | ||
| 59 | + :label="$t('feeDetailOwner.roomCount')" | ||
| 60 | + align="center" | ||
| 61 | + > | ||
| 62 | + <template #default="{row}"> | ||
| 63 | + <el-link type="primary" @click="_viewOwnerRooms(row)"> | ||
| 64 | + {{row.roomCount || 0}} | ||
| 65 | + </el-link> | ||
| 66 | + </template> | ||
| 67 | + </el-table-column> | ||
| 68 | + <el-table-column | ||
| 69 | + prop="memberCount" | ||
| 70 | + :label="$t('feeDetailOwner.memberCount')" | ||
| 71 | + align="center" | ||
| 72 | + > | ||
| 73 | + <template #default="{row}"> | ||
| 74 | + <el-link type="primary" @click="_viewOwnerMembers(row)"> | ||
| 75 | + {{row.memberCount || 0}} | ||
| 76 | + </el-link> | ||
| 77 | + </template> | ||
| 78 | + </el-table-column> | ||
| 79 | + <el-table-column | ||
| 80 | + prop="carCount" | ||
| 81 | + :label="$t('feeDetailOwner.carCount')" | ||
| 82 | + align="center" | ||
| 83 | + > | ||
| 84 | + <template #default="{row}"> | ||
| 85 | + <el-link type="primary" @click="_viewOwnerCars(row)"> | ||
| 86 | + {{row.carCount || 0}} | ||
| 87 | + </el-link> | ||
| 88 | + </template> | ||
| 89 | + </el-table-column> | ||
| 90 | + <el-table-column | ||
| 91 | + prop="complaintCount" | ||
| 92 | + :label="$t('feeDetailOwner.complaintCount')" | ||
| 93 | + align="center" | ||
| 94 | + > | ||
| 95 | + <template #default="{row}"> | ||
| 96 | + <el-link type="primary" @click="_viewComplaints(row)"> | ||
| 97 | + {{row.complaintCount || 0}} | ||
| 98 | + </el-link> | ||
| 99 | + </template> | ||
| 100 | + </el-table-column> | ||
| 101 | + <el-table-column | ||
| 102 | + prop="repairCount" | ||
| 103 | + :label="$t('feeDetailOwner.repairCount')" | ||
| 104 | + align="center" | ||
| 105 | + > | ||
| 106 | + <template #default="{row}"> | ||
| 107 | + <el-link type="primary" @click="_viewRepairs(row)"> | ||
| 108 | + {{row.repairCount || 0}} | ||
| 109 | + </el-link> | ||
| 110 | + </template> | ||
| 111 | + </el-table-column> | ||
| 112 | + <el-table-column | ||
| 113 | + prop="oweFee" | ||
| 114 | + :label="$t('feeDetailOwner.oweFee')" | ||
| 115 | + align="center" | ||
| 116 | + > | ||
| 117 | + <template #default="{row}"> | ||
| 118 | + <el-link type="primary" @click="_viewOweFees(row)"> | ||
| 119 | + {{row.oweFee || '0.00'}} | ||
| 120 | + </el-link> | ||
| 121 | + </template> | ||
| 122 | + </el-table-column> | ||
| 123 | + <el-table-column | ||
| 124 | + prop="contractCount" | ||
| 125 | + :label="$t('feeDetailOwner.contractCount')" | ||
| 126 | + align="center" | ||
| 127 | + > | ||
| 128 | + <template #default="{row}"> | ||
| 129 | + <el-link type="primary" @click="_viewRoomContracts(row)"> | ||
| 130 | + {{row.contractCount || 0}} | ||
| 131 | + </el-link> | ||
| 132 | + </template> | ||
| 133 | + </el-table-column> | ||
| 134 | + </el-table> | ||
| 135 | + | ||
| 136 | + <el-row class="margin-top"> | ||
| 137 | + <el-col :span="4"></el-col> | ||
| 138 | + <el-col :span="20"> | ||
| 139 | + <el-pagination | ||
| 140 | + @current-change="handleCurrentChange" | ||
| 141 | + :current-page="currentPage" | ||
| 142 | + :page-size="pageSize" | ||
| 143 | + layout="total, prev, pager, next, jumper" | ||
| 144 | + :total="total" | ||
| 145 | + ></el-pagination> | ||
| 146 | + </el-col> | ||
| 147 | + </el-row> | ||
| 148 | + </div> | ||
| 149 | + | ||
| 150 | + <owner-rooms ref="ownerRooms"></owner-rooms> | ||
| 151 | + <owner-members ref="ownerMembers"></owner-members> | ||
| 152 | + <owner-cars ref="ownerCars"></owner-cars> | ||
| 153 | + <owner-complaints ref="ownerComplaints"></owner-complaints> | ||
| 154 | + <owner-repairs ref="ownerRepairs"></owner-repairs> | ||
| 155 | + <owner-owe-fees ref="ownerOweFees"></owner-owe-fees> | ||
| 156 | + <room-contracts ref="roomContracts"></room-contracts> | ||
| 157 | + </div> | ||
| 158 | +</template> | ||
| 159 | + | ||
| 160 | +<script> | ||
| 161 | +import { queryOwners } from '@/api/fee/feeDetailOwnerApi' | ||
| 162 | +import OwnerRooms from '@/components/owner/ownerRooms' | ||
| 163 | +import OwnerMembers from '@/components/owner/ownerMembers' | ||
| 164 | +import OwnerCars from '@/components/owner/ownerCars' | ||
| 165 | +import OwnerComplaints from '@/components/owner/ownerComplaints' | ||
| 166 | +import OwnerRepairs from '@/components/owner/ownerRepairs' | ||
| 167 | +import OwnerOweFees from '@/components/owner/ownerOweFees' | ||
| 168 | +import RoomContracts from '@/components/room/roomContracts' | ||
| 169 | + | ||
| 170 | +export default { | ||
| 171 | + name: 'FeeDetailOwner', | ||
| 172 | + components: { | ||
| 173 | + OwnerRooms, | ||
| 174 | + OwnerMembers, | ||
| 175 | + OwnerCars, | ||
| 176 | + OwnerComplaints, | ||
| 177 | + OwnerRepairs, | ||
| 178 | + OwnerOweFees, | ||
| 179 | + RoomContracts | ||
| 180 | + }, | ||
| 181 | + data() { | ||
| 182 | + return { | ||
| 183 | + feeDetailOwnerInfo: { | ||
| 184 | + owners: [], | ||
| 185 | + ownerId: '' | ||
| 186 | + }, | ||
| 187 | + currentPage: 1, | ||
| 188 | + pageSize: 10, | ||
| 189 | + total: 0 | ||
| 190 | + } | ||
| 191 | + }, | ||
| 192 | + methods: { | ||
| 193 | + open(params) { | ||
| 194 | + if (!params.ownerId) return | ||
| 195 | + this.feeDetailOwnerInfo.ownerId = params.ownerId | ||
| 196 | + this._loadFeeDetailOwnerData(this.currentPage, this.pageSize) | ||
| 197 | + }, | ||
| 198 | + handleCurrentChange(val) { | ||
| 199 | + this.currentPage = val | ||
| 200 | + this._loadFeeDetailOwnerData(this.currentPage, this.pageSize) | ||
| 201 | + }, | ||
| 202 | + async _loadFeeDetailOwnerData(page, row) { | ||
| 203 | + try { | ||
| 204 | + const params = { | ||
| 205 | + ownerId: this.feeDetailOwnerInfo.ownerId, | ||
| 206 | + communityId: this.$store.getters.communityId, | ||
| 207 | + ownerTypeCd: '1001', | ||
| 208 | + page, | ||
| 209 | + row | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + const res = await queryOwners(params) | ||
| 213 | + this.feeDetailOwnerInfo.owners = res.data | ||
| 214 | + this.total = res.records | ||
| 215 | + } catch (error) { | ||
| 216 | + console.error('Failed to load owner data:', error) | ||
| 217 | + } | ||
| 218 | + }, | ||
| 219 | + _viewOwnerRooms(owner) { | ||
| 220 | + this.$refs.ownerRooms.open(owner) | ||
| 221 | + }, | ||
| 222 | + _viewOwnerMembers(owner) { | ||
| 223 | + this.$refs.ownerMembers.open(owner) | ||
| 224 | + }, | ||
| 225 | + _viewOwnerCars(owner) { | ||
| 226 | + this.$refs.ownerCars.open(owner) | ||
| 227 | + }, | ||
| 228 | + _viewComplaints(owner) { | ||
| 229 | + this.$refs.ownerComplaints.open(owner) | ||
| 230 | + }, | ||
| 231 | + _viewRepairs(owner) { | ||
| 232 | + this.$refs.ownerRepairs.open(owner) | ||
| 233 | + }, | ||
| 234 | + _viewOweFees(owner) { | ||
| 235 | + this.$refs.ownerOweFees.open(owner) | ||
| 236 | + }, | ||
| 237 | + _viewRoomContracts(owner) { | ||
| 238 | + this.$refs.roomContracts.open(owner) | ||
| 239 | + } | ||
| 240 | + } | ||
| 241 | +} | ||
| 242 | +</script> | ||
| 0 | \ No newline at end of file | 243 | \ No newline at end of file |
src/components/fee/feeDetailOwnerDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailOwnerDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-owner ref="feeDetailOwner"></fee-detail-owner> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailOwner from './feeDetailOwner' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailOwnerDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailOwner | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailOwner.open({ | ||
| 19 | + ownerId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailReceipt.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row class="margin-top-lg"> | ||
| 4 | + <el-col :span="12"></el-col> | ||
| 5 | + <el-col :span="12" class="text-right"> | ||
| 6 | + <el-button | ||
| 7 | + type="primary" | ||
| 8 | + size="small" | ||
| 9 | + @click="_printFeeReceipt" | ||
| 10 | + >{{ $t('feeDetailReceipt.print') }}</el-button> | ||
| 11 | + <el-button | ||
| 12 | + type="primary" | ||
| 13 | + size="small" | ||
| 14 | + @click="_printFeeSmallReceipt" | ||
| 15 | + >{{ $t('feeDetailReceipt.printSmall') }}</el-button> | ||
| 16 | + <el-button | ||
| 17 | + type="primary" | ||
| 18 | + size="small" | ||
| 19 | + @click="_printApplyFeeReceipt" | ||
| 20 | + >{{ $t('feeDetailReceipt.printApply') }}</el-button> | ||
| 21 | + </el-col> | ||
| 22 | + </el-row> | ||
| 23 | + | ||
| 24 | + <div class="margin-top"> | ||
| 25 | + <el-table | ||
| 26 | + :data="feeDetailReceiptInfo.feeReceipts" | ||
| 27 | + border | ||
| 28 | + style="width: 100%" | ||
| 29 | + > | ||
| 30 | + <el-table-column | ||
| 31 | + width="60" | ||
| 32 | + align="center" | ||
| 33 | + > | ||
| 34 | + <template #header> | ||
| 35 | + <el-checkbox | ||
| 36 | + v-model="feeDetailReceiptInfo.quan" | ||
| 37 | + @change="checkAllReceipt" | ||
| 38 | + ></el-checkbox> | ||
| 39 | + </template> | ||
| 40 | + <template #default="{row}"> | ||
| 41 | + <el-checkbox | ||
| 42 | + v-model="feeDetailReceiptInfo.selectReceipts" | ||
| 43 | + :label="row.receiptId" | ||
| 44 | + ></el-checkbox> | ||
| 45 | + </template> | ||
| 46 | + </el-table-column> | ||
| 47 | + <el-table-column | ||
| 48 | + prop="objName" | ||
| 49 | + :label="$t('feeDetailReceipt.feeType')" | ||
| 50 | + align="center" | ||
| 51 | + ></el-table-column> | ||
| 52 | + <el-table-column | ||
| 53 | + prop="payObjName" | ||
| 54 | + :label="$t('feeDetailReceipt.owner')" | ||
| 55 | + align="center" | ||
| 56 | + ></el-table-column> | ||
| 57 | + <el-table-column | ||
| 58 | + prop="feeName" | ||
| 59 | + :label="$t('feeDetailReceipt.feeItem')" | ||
| 60 | + align="center" | ||
| 61 | + ></el-table-column> | ||
| 62 | + <el-table-column | ||
| 63 | + :label="$t('feeDetailReceipt.feePeriod')" | ||
| 64 | + align="center" | ||
| 65 | + > | ||
| 66 | + <template #default="{row}"> | ||
| 67 | + {{$dayjs(row.startTime).format('YYYY-MM-DD')}}~<br/> | ||
| 68 | + {{$dayjs(row.endTime).format('YYYY-MM-DD')}} | ||
| 69 | + </template> | ||
| 70 | + </el-table-column> | ||
| 71 | + <el-table-column | ||
| 72 | + prop="amount" | ||
| 73 | + :label="$t('feeDetailReceipt.totalAmount')" | ||
| 74 | + align="center" | ||
| 75 | + > | ||
| 76 | + <template #default="{row}"> | ||
| 77 | + {{row.amount}}{{$t('feeDetailReceipt.yuan')}} | ||
| 78 | + </template> | ||
| 79 | + </el-table-column> | ||
| 80 | + <el-table-column | ||
| 81 | + prop="createTime" | ||
| 82 | + :label="$t('feeDetailReceipt.paymentTime')" | ||
| 83 | + align="center" | ||
| 84 | + ></el-table-column> | ||
| 85 | + <el-table-column | ||
| 86 | + prop="receiptId" | ||
| 87 | + :label="$t('feeDetailReceipt.receiptId')" | ||
| 88 | + align="center" | ||
| 89 | + ></el-table-column> | ||
| 90 | + </el-table> | ||
| 91 | + | ||
| 92 | + <el-row class="margin-top"> | ||
| 93 | + <el-col :span="24" class="float-right"> | ||
| 94 | + <el-pagination | ||
| 95 | + @current-change="handleCurrentChange" | ||
| 96 | + :current-page="currentPage" | ||
| 97 | + :page-size="pageSize" | ||
| 98 | + layout="total, prev, pager, next, jumper" | ||
| 99 | + :total="total" | ||
| 100 | + ></el-pagination> | ||
| 101 | + </el-col> | ||
| 102 | + </el-row> | ||
| 103 | + </div> | ||
| 104 | + </div> | ||
| 105 | +</template> | ||
| 106 | + | ||
| 107 | +<script> | ||
| 108 | +import { queryFeeReceipt, listFeePrintPage } from '@/api/fee/feeDetailReceiptApi' | ||
| 109 | + | ||
| 110 | +export default { | ||
| 111 | + name: 'FeeDetailReceipt', | ||
| 112 | + data() { | ||
| 113 | + return { | ||
| 114 | + feeDetailReceiptInfo: { | ||
| 115 | + feeReceipts: [], | ||
| 116 | + feeId: '', | ||
| 117 | + total: 0, | ||
| 118 | + records: 0, | ||
| 119 | + selectReceipts: [], | ||
| 120 | + quan: false, | ||
| 121 | + printUrl: '/print.html#/pages/property/printPayFee' | ||
| 122 | + }, | ||
| 123 | + currentPage: 1, | ||
| 124 | + pageSize: 10 | ||
| 125 | + } | ||
| 126 | + }, | ||
| 127 | + watch: { | ||
| 128 | + 'feeDetailReceiptInfo.selectReceipts': { | ||
| 129 | + handler(newVal) { | ||
| 130 | + this.feeDetailReceiptInfo.quan = newVal.length === this.feeDetailReceiptInfo.feeReceipts.length | ||
| 131 | + }, | ||
| 132 | + deep: true | ||
| 133 | + } | ||
| 134 | + }, | ||
| 135 | + methods: { | ||
| 136 | + open(params) { | ||
| 137 | + if (!params.feeId) return | ||
| 138 | + this.feeDetailReceiptInfo = Object.assign(this.feeDetailReceiptInfo, params) | ||
| 139 | + this._listFeePrintPages() | ||
| 140 | + this._listFeeDetailReceipt(this.currentPage, this.pageSize) | ||
| 141 | + }, | ||
| 142 | + handleCurrentChange(val) { | ||
| 143 | + this.currentPage = val | ||
| 144 | + this._listFeeDetailReceipt(this.currentPage, this.pageSize) | ||
| 145 | + }, | ||
| 146 | + async _listFeeDetailReceipt(page, rows) { | ||
| 147 | + try { | ||
| 148 | + this.feeDetailReceiptInfo.selectReceipts = [] | ||
| 149 | + this.feeDetailReceiptInfo.quan = false | ||
| 150 | + | ||
| 151 | + const params = { | ||
| 152 | + page, | ||
| 153 | + row: rows, | ||
| 154 | + feeId: this.feeDetailReceiptInfo.feeId, | ||
| 155 | + communityId: this.$store.getters.communityId | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + const res = await queryFeeReceipt(params) | ||
| 159 | + this.feeDetailReceiptInfo.total = res.total | ||
| 160 | + this.feeDetailReceiptInfo.records = res.records | ||
| 161 | + this.feeDetailReceiptInfo.feeReceipts = res.data | ||
| 162 | + } catch (error) { | ||
| 163 | + console.error('Failed to load receipt data:', error) | ||
| 164 | + } | ||
| 165 | + }, | ||
| 166 | + _printFeeReceipt() { | ||
| 167 | + if (this.feeDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 168 | + this.$message.warning(this.$t('feeDetailReceipt.selectPrintReceipt')) | ||
| 169 | + return | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + const receiptIds = this.feeDetailReceiptInfo.selectReceipts.join(',') | ||
| 173 | + window.open(`${this.feeDetailReceiptInfo.printUrl}?receiptIds=${receiptIds}&apply=N`) | ||
| 174 | + }, | ||
| 175 | + _printApplyFeeReceipt() { | ||
| 176 | + if (this.feeDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 177 | + this.$message.warning(this.$t('feeDetailReceipt.selectPrintApply')) | ||
| 178 | + return | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + const receiptIds = this.feeDetailReceiptInfo.selectReceipts.join(',') | ||
| 182 | + window.open(`/print.html#/pages/property/printPayFee?receiptIds=${receiptIds}&apply=Y`) | ||
| 183 | + }, | ||
| 184 | + _printFeeSmallReceipt() { | ||
| 185 | + if (this.feeDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 186 | + this.$message.warning(this.$t('feeDetailReceipt.selectPrintReceipt')) | ||
| 187 | + return | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + const receiptIds = this.feeDetailReceiptInfo.selectReceipts.join(',') | ||
| 191 | + window.open(`/smallPrint.html#/pages/property/printSmallPayFee?receiptIds=${receiptIds}`) | ||
| 192 | + }, | ||
| 193 | + checkAllReceipt(e) { | ||
| 194 | + if (e) { | ||
| 195 | + this.feeDetailReceiptInfo.selectReceipts = this.feeDetailReceiptInfo.feeReceipts.map(item => item.receiptId) | ||
| 196 | + } else { | ||
| 197 | + this.feeDetailReceiptInfo.selectReceipts = [] | ||
| 198 | + } | ||
| 199 | + }, | ||
| 200 | + async _listFeePrintPages() { | ||
| 201 | + try { | ||
| 202 | + const params = { | ||
| 203 | + page: 1, | ||
| 204 | + row: 1, | ||
| 205 | + state: 'T', | ||
| 206 | + communityId: this.$store.getters.communityId | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + const res = await listFeePrintPage(params) | ||
| 210 | + if (res.data && res.data.length > 0) { | ||
| 211 | + this.feeDetailReceiptInfo.printUrl = res.data[0].url | ||
| 212 | + } | ||
| 213 | + } catch (error) { | ||
| 214 | + console.error('Failed to load print pages:', error) | ||
| 215 | + } | ||
| 216 | + } | ||
| 217 | + } | ||
| 218 | +} | ||
| 219 | +</script> | ||
| 0 | \ No newline at end of file | 220 | \ No newline at end of file |
src/components/fee/feeDetailReceiptDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailReceiptDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-receipt ref="feeDetailReceipt"></fee-detail-receipt> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailReceipt from './feeDetailReceipt' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailReceiptDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailReceipt | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailReceipt.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailRoom.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table :data="feeDetailRoomInfo.rooms" style="width: 100%"> | ||
| 5 | + <el-table-column :label="$t('feeDetailRoom.roomId')" align="center"> | ||
| 6 | + <template slot-scope="scope">{{ scope.row.floorNum }}-{{ scope.row.unitNum }}-{{ scope.row.roomNum }}</template> | ||
| 7 | + </el-table-column> | ||
| 8 | + <el-table-column prop="layer" :label="$t('feeDetailRoom.floor')" align="center"></el-table-column> | ||
| 9 | + <el-table-column prop="roomSubTypeName" :label="$t('feeDetailRoom.type')" align="center"></el-table-column> | ||
| 10 | + <el-table-column :label="$t('feeDetailRoom.area')" align="center"> | ||
| 11 | + <template slot-scope="scope">{{ scope.row.builtUpArea }}/{{ scope.row.roomArea }}</template> | ||
| 12 | + </el-table-column> | ||
| 13 | + <el-table-column prop="roomRent" :label="$t('feeDetailRoom.rent')" align="center"></el-table-column> | ||
| 14 | + <el-table-column prop="stateName" :label="$t('feeDetailRoom.roomStatus')" align="center"></el-table-column> | ||
| 15 | + <el-table-column :label="$t('feeDetailRoom.roomArrears')" align="center"> | ||
| 16 | + <template slot-scope="scope">{{ scope.row.roomOweFee || | ||
| 17 | + '0.00'}}({{ $t('feeDetailRoom.updateDaily') }})</template> | ||
| 18 | + </el-table-column> | ||
| 19 | + <el-table-column :label="$t('feeDetailRoom.operation')" align="center"> | ||
| 20 | + <template slot-scope="scope"> | ||
| 21 | + <el-button v-if="scope.row.state != '2002'" size="mini" @click="_toSimplifyAcceptance(scope.row)"> | ||
| 22 | + {{ $t('feeDetailRoom.businessAcceptance') }} | ||
| 23 | + </el-button> | ||
| 24 | + </template> | ||
| 25 | + </el-table-column> | ||
| 26 | + </el-table> | ||
| 27 | + | ||
| 28 | + <el-row class="margin-top"> | ||
| 29 | + <el-col :span="12"></el-col> | ||
| 30 | + <el-col :span="12"> | ||
| 31 | + <el-pagination @current-change="handleCurrentChange" :current-page="pagination.currentPage" | ||
| 32 | + :page-size="pagination.pageSize" layout="total, prev, pager, next" :total="pagination.total"> | ||
| 33 | + </el-pagination> | ||
| 34 | + </el-col> | ||
| 35 | + </el-row> | ||
| 36 | + </div> | ||
| 37 | + </div> | ||
| 38 | +</template> | ||
| 39 | + | ||
| 40 | +<script> | ||
| 41 | +import { queryRooms } from '@/api/fee/feeDetailRoomApi' | ||
| 42 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 43 | + | ||
| 44 | +export default { | ||
| 45 | + name: 'FeeDetailRoom', | ||
| 46 | + data() { | ||
| 47 | + return { | ||
| 48 | + feeDetailRoomInfo: { | ||
| 49 | + rooms: [], | ||
| 50 | + roomId: '', | ||
| 51 | + roomNum: '', | ||
| 52 | + allOweFeeAmount: '0' | ||
| 53 | + }, | ||
| 54 | + pagination: { | ||
| 55 | + currentPage: 1, | ||
| 56 | + pageSize: 10, | ||
| 57 | + total: 0 | ||
| 58 | + } | ||
| 59 | + } | ||
| 60 | + }, | ||
| 61 | + methods: { | ||
| 62 | + open(params) { | ||
| 63 | + this.feeDetailRoomInfo.roomId = params.payerObjId | ||
| 64 | + this._loadFeeDetailRoomData() | ||
| 65 | + }, | ||
| 66 | + _loadFeeDetailRoomData() { | ||
| 67 | + const params = { | ||
| 68 | + communityId: getCommunityId(), | ||
| 69 | + roomId: this.feeDetailRoomInfo.roomId, | ||
| 70 | + page: this.pagination.currentPage, | ||
| 71 | + row: this.pagination.pageSize | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + queryRooms(params).then(res => { | ||
| 75 | + this.feeDetailRoomInfo.rooms = res.rooms | ||
| 76 | + this.pagination.total = res.records | ||
| 77 | + }).catch(error => { | ||
| 78 | + console.error('Failed to load room details:', error) | ||
| 79 | + }) | ||
| 80 | + }, | ||
| 81 | + handleCurrentChange(val) { | ||
| 82 | + this.pagination.currentPage = val | ||
| 83 | + this._loadFeeDetailRoomData() | ||
| 84 | + }, | ||
| 85 | + _toSimplifyAcceptance(room) { | ||
| 86 | + const date = new Date() | ||
| 87 | + this.$store.dispatch('app/saveData', { | ||
| 88 | + key: 'JAVA110_IS_BACK', | ||
| 89 | + value: date.getTime() | ||
| 90 | + }) | ||
| 91 | + this.$store.dispatch('app/saveData', { | ||
| 92 | + key: 'simplifyAcceptanceSearch', | ||
| 93 | + value: { | ||
| 94 | + searchType: '1', | ||
| 95 | + searchValue: `${room.floorNum}-${room.unitNum}-${room.roomNum}`, | ||
| 96 | + searchPlaceholder: this.$t('feeDetailRoom.searchPlaceholder') | ||
| 97 | + } | ||
| 98 | + }) | ||
| 99 | + this.$router.push('/pages/property/simplifyAcceptance?tab=businessAcceptance') | ||
| 100 | + } | ||
| 101 | + } | ||
| 102 | +} | ||
| 103 | +</script> | ||
| 0 | \ No newline at end of file | 104 | \ No newline at end of file |
src/components/fee/feeDetailRoomDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailRoomDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-room ref="feeDetailRoom"></fee-detail-room> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailRoom from './feeDetailRoom' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailRoomDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailRoom | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailRoom.open({ | ||
| 19 | + payerObjId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/feeDetailRuleBill.vue
| @@ -25,7 +25,7 @@ | @@ -25,7 +25,7 @@ | ||
| 25 | <el-table-column :label="$t('common.operation')" align="center"> | 25 | <el-table-column :label="$t('common.operation')" align="center"> |
| 26 | <template slot-scope="scope"> | 26 | <template slot-scope="scope"> |
| 27 | <el-button type="text" size="small"> | 27 | <el-button type="text" size="small"> |
| 28 | - <a :href="'/#/pages/fee/feeDetail?feeId=' + scope.row.feeId" target="_blank"> | 28 | + <a :href="'/#/views/fee/feeDetail?feeId=' + scope.row.feeId" target="_blank"> |
| 29 | {{ $t('common.detail') }} | 29 | {{ $t('common.detail') }} |
| 30 | </a> | 30 | </a> |
| 31 | </el-button> | 31 | </el-button> |
src/components/fee/feeDetailSub.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row> | ||
| 4 | + <el-col :span="24" class="text-right"> | ||
| 5 | + <el-button type="primary" size="small" style="margin-left: 10px" | ||
| 6 | + v-if="hasPrivilege('502020090427190001') && feeDetailSubInfo.fee.state === '2008001'" @click="_splitPayFee"> | ||
| 7 | + {{ $t('feeDetailSub.split') }} | ||
| 8 | + </el-button> | ||
| 9 | + </el-col> | ||
| 10 | + </el-row> | ||
| 11 | + | ||
| 12 | + <el-table :data="feeDetailSubInfo.subs" border style="width: 100%" class="margin-top"> | ||
| 13 | + <el-table-column prop="preFeeId" :label="$t('feeDetailSub.parentFeeId')" align="center"> | ||
| 14 | + <template slot-scope="scope"> | ||
| 15 | + <router-link :to="`/views/fee/feeDetail?feeId=${scope.row.preFeeId}`" target="_blank"> | ||
| 16 | + {{ scope.row.preFeeId }} | ||
| 17 | + </router-link> | ||
| 18 | + </template> | ||
| 19 | + </el-table-column> | ||
| 20 | + <el-table-column prop="feeId" :label="$t('feeDetailSub.childFeeId')" align="center"> | ||
| 21 | + <template slot-scope="scope"> | ||
| 22 | + <router-link :to="`/views/fee/feeDetail?feeId=${scope.row.feeId}`" target="_blank"> | ||
| 23 | + {{ scope.row.feeId }} | ||
| 24 | + </router-link> | ||
| 25 | + </template> | ||
| 26 | + </el-table-column> | ||
| 27 | + <el-table-column prop="feeName" :label="$t('feeDetailSub.feeName')" align="center" /> | ||
| 28 | + <el-table-column prop="payerObjName" :label="$t('feeDetailSub.feeObject')" align="center" /> | ||
| 29 | + <el-table-column :label="$t('feeDetailSub.billingPeriod')" align="center"> | ||
| 30 | + <template slot-scope="scope"> | ||
| 31 | + {{ dateFormat(new Date(scope.row.endTime)) }}<br /> | ||
| 32 | + ~{{ dateFormat(new Date(scope.row.maxTime)) }} | ||
| 33 | + </template> | ||
| 34 | + </el-table-column> | ||
| 35 | + <el-table-column prop="createTime" :label="$t('feeDetailSub.splitTime')" align="center" /> | ||
| 36 | + <el-table-column :label="$t('feeDetailSub.operation')" align="center"> | ||
| 37 | + <template slot-scope="scope"> | ||
| 38 | + <el-button size="mini" @click="_mergeFee(scope.row)"> | ||
| 39 | + {{ $t('feeDetailSub.restoreMerge') }} | ||
| 40 | + </el-button> | ||
| 41 | + </template> | ||
| 42 | + </el-table-column> | ||
| 43 | + </el-table> | ||
| 44 | + | ||
| 45 | + <el-row> | ||
| 46 | + <el-col :span="24" class="text-right"> | ||
| 47 | + <el-pagination @current-change="handleCurrentChange" :current-page="currentPage" :page-size="pageSize" | ||
| 48 | + :total="feeDetailSubInfo.total" layout="total, prev, pager, next" /> | ||
| 49 | + </el-col> | ||
| 50 | + </el-row> | ||
| 51 | + | ||
| 52 | + <merge-fee ref="mergeFee" @merge-success="loadData" /> | ||
| 53 | + <split-fee ref="splitFee" @split-success="loadData" /> | ||
| 54 | + </div> | ||
| 55 | +</template> | ||
| 56 | + | ||
| 57 | +<script> | ||
| 58 | +import { listPayFeeSub, listFee } from '@/api/fee/feeDetailSubApi' | ||
| 59 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 60 | +import MergeFee from './mergeFee' | ||
| 61 | +import SplitFee from './splitFee' | ||
| 62 | +import { dateFormat } from '@/utils/dateUtil' | ||
| 63 | + | ||
| 64 | +export default { | ||
| 65 | + name: 'FeeDetailSub', | ||
| 66 | + components: { | ||
| 67 | + MergeFee, | ||
| 68 | + SplitFee | ||
| 69 | + }, | ||
| 70 | + data() { | ||
| 71 | + return { | ||
| 72 | + feeDetailSubInfo: { | ||
| 73 | + subs: [], | ||
| 74 | + feeId: '', | ||
| 75 | + total: 0, | ||
| 76 | + records: 0, | ||
| 77 | + fee: {} | ||
| 78 | + }, | ||
| 79 | + currentPage: 1, | ||
| 80 | + pageSize: 10, | ||
| 81 | + communityId: '' | ||
| 82 | + } | ||
| 83 | + }, | ||
| 84 | + methods: { | ||
| 85 | + open(params) { | ||
| 86 | + if (!params.feeId) return | ||
| 87 | + Object.assign(this.feeDetailSubInfo, params) | ||
| 88 | + this.communityId = getCommunityId() | ||
| 89 | + this.loadData() | ||
| 90 | + }, | ||
| 91 | + async loadData() { | ||
| 92 | + await this._listFeeDetailSub(this.currentPage, this.pageSize) | ||
| 93 | + await this._loadFeeDetailSubFeeInfo() | ||
| 94 | + }, | ||
| 95 | + async _listFeeDetailSub(page, rows) { | ||
| 96 | + try { | ||
| 97 | + const params = { | ||
| 98 | + page, | ||
| 99 | + row: rows, | ||
| 100 | + pcFeeId: this.feeDetailSubInfo.feeId, | ||
| 101 | + communityId: this.communityId | ||
| 102 | + } | ||
| 103 | + const res = await listPayFeeSub(params) | ||
| 104 | + this.feeDetailSubInfo.total = res.total | ||
| 105 | + this.feeDetailSubInfo.records = res.records | ||
| 106 | + this.feeDetailSubInfo.subs = res.data | ||
| 107 | + this.currentPage = page | ||
| 108 | + } catch (error) { | ||
| 109 | + console.error('Failed to load fee sub list:', error) | ||
| 110 | + } | ||
| 111 | + }, | ||
| 112 | + async _loadFeeDetailSubFeeInfo() { | ||
| 113 | + try { | ||
| 114 | + const params = { | ||
| 115 | + page: 1, | ||
| 116 | + row: 1, | ||
| 117 | + feeId: this.feeDetailSubInfo.feeId, | ||
| 118 | + communityId: this.communityId | ||
| 119 | + } | ||
| 120 | + const res = await listFee(params) | ||
| 121 | + this.feeDetailSubInfo.fee = res.fees[0] || {} | ||
| 122 | + } catch (error) { | ||
| 123 | + console.error('Failed to load fee info:', error) | ||
| 124 | + } | ||
| 125 | + }, | ||
| 126 | + _mergeFee(fee) { | ||
| 127 | + this.$refs.mergeFee.open(fee) | ||
| 128 | + }, | ||
| 129 | + _splitPayFee() { | ||
| 130 | + this.$refs.splitFee.open(this.feeDetailSubInfo.fee) | ||
| 131 | + }, | ||
| 132 | + handleCurrentChange(page) { | ||
| 133 | + this._listFeeDetailSub(page, this.pageSize) | ||
| 134 | + }, | ||
| 135 | + dateFormat | ||
| 136 | + } | ||
| 137 | +} | ||
| 138 | +</script> | ||
| 139 | + | ||
| 140 | +<style scoped> | ||
| 141 | +.margin-top { | ||
| 142 | + margin-top: 20px; | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +.text-right { | ||
| 146 | + text-align: right; | ||
| 147 | +} | ||
| 148 | +</style> | ||
| 0 | \ No newline at end of file | 149 | \ No newline at end of file |
src/components/fee/feeDetailSubDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('feeDetailSubDemo.openComponent') }}</el-button> | ||
| 4 | + <fee-detail-sub ref="feeDetailSub"></fee-detail-sub> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import FeeDetailSub from './feeDetailSub' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'FeeDetailSubDemo', | ||
| 13 | + components: { | ||
| 14 | + FeeDetailSub | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.feeDetailSub.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | +</script> | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
src/components/fee/mergeFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('mergeFee.confirmOperation')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="50%" | ||
| 6 | + :before-close="closeMergeFeeModel" | ||
| 7 | + > | ||
| 8 | + <el-table :data="[]" border style="width: 100%"> | ||
| 9 | + <el-table-column align="center"> | ||
| 10 | + <template > | ||
| 11 | + {{ $t('mergeFee.mergeDescription') }} | ||
| 12 | + </template> | ||
| 13 | + </el-table-column> | ||
| 14 | + </el-table> | ||
| 15 | + <span slot="footer" class="dialog-footer"> | ||
| 16 | + <el-button @click="closeMergeFeeModel">{{ $t('mergeFee.cancel') }}</el-button> | ||
| 17 | + <el-button type="primary" @click="_doMergeFee">{{ $t('mergeFee.confirmMerge') }}</el-button> | ||
| 18 | + </span> | ||
| 19 | + </el-dialog> | ||
| 20 | +</template> | ||
| 21 | + | ||
| 22 | +<script> | ||
| 23 | +import { mergePayFee } from '@/api/fee/mergeFeeApi' | ||
| 24 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 25 | + | ||
| 26 | +export default { | ||
| 27 | + name: 'MergeFee', | ||
| 28 | + data() { | ||
| 29 | + return { | ||
| 30 | + visible: false, | ||
| 31 | + mergeFeeInfo: {}, | ||
| 32 | + communityId: '' | ||
| 33 | + } | ||
| 34 | + }, | ||
| 35 | + methods: { | ||
| 36 | + open(params) { | ||
| 37 | + this.mergeFeeInfo = params | ||
| 38 | + this.communityId = getCommunityId() | ||
| 39 | + this.visible = true | ||
| 40 | + }, | ||
| 41 | + closeMergeFeeModel() { | ||
| 42 | + this.visible = false | ||
| 43 | + }, | ||
| 44 | + async _doMergeFee() { | ||
| 45 | + try { | ||
| 46 | + const params = { | ||
| 47 | + feeId: this.mergeFeeInfo.feeId, | ||
| 48 | + communityId: this.communityId | ||
| 49 | + } | ||
| 50 | + const res = await mergePayFee(params) | ||
| 51 | + if (res.code === 0) { | ||
| 52 | + this.closeMergeFeeModel() | ||
| 53 | + this.$emit('merge-success') | ||
| 54 | + this.$message.success(this.$t('mergeFee.mergeSuccess')) | ||
| 55 | + } else { | ||
| 56 | + this.$message.error(res.msg) | ||
| 57 | + } | ||
| 58 | + } catch (error) { | ||
| 59 | + this.$message.error(error.message) | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | +} | ||
| 64 | +</script> | ||
| 0 | \ No newline at end of file | 65 | \ No newline at end of file |
src/components/fee/mergeFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-button @click="openComponent">{{ $t('mergeFeeDemo.openComponent') }}</el-button> | ||
| 4 | + <merge-fee ref="mergeFee" @merge-success="handleMergeSuccess"></merge-fee> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import MergeFee from './mergeFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + name: 'MergeFeeDemo', | ||
| 13 | + components: { | ||
| 14 | + MergeFee | ||
| 15 | + }, | ||
| 16 | + methods: { | ||
| 17 | + openComponent() { | ||
| 18 | + this.$refs.mergeFee.open({ | ||
| 19 | + feeId: '123' | ||
| 20 | + }) | ||
| 21 | + }, | ||
| 22 | + handleMergeSuccess() { | ||
| 23 | + this.$message.success(this.$t('mergeFeeDemo.mergeSuccess')) | ||
| 24 | + } | ||
| 25 | + } | ||
| 26 | +} | ||
| 27 | +</script> | ||
| 0 | \ No newline at end of file | 28 | \ No newline at end of file |
src/components/fee/simplifyRoomFee.vue
| @@ -165,7 +165,7 @@ | @@ -165,7 +165,7 @@ | ||
| 165 | {{ $t('simplifyRoomFee.feeChange') }} | 165 | {{ $t('simplifyRoomFee.feeChange') }} |
| 166 | </el-dropdown-item> | 166 | </el-dropdown-item> |
| 167 | <el-dropdown-item> | 167 | <el-dropdown-item> |
| 168 | - <a target="_blank" :href="'/#/pages/fee/feeDetail?feeId=' + scope.row.feeId"> | 168 | + <a target="_blank" :href="'/#/views/fee/feeDetail?feeId=' + scope.row.feeId"> |
| 169 | {{ $t('simplifyRoomFee.details') }} | 169 | {{ $t('simplifyRoomFee.details') }} |
| 170 | </a> | 170 | </a> |
| 171 | </el-dropdown-item> | 171 | </el-dropdown-item> |
| @@ -239,7 +239,7 @@ | @@ -239,7 +239,7 @@ | ||
| 239 | </el-table-column> | 239 | </el-table-column> |
| 240 | <el-table-column :label="$t('simplifyRoomFee.operation')" align="center"> | 240 | <el-table-column :label="$t('simplifyRoomFee.operation')" align="center"> |
| 241 | <template slot-scope="scope"> | 241 | <template slot-scope="scope"> |
| 242 | - <a target="_blank" :href="'/#/pages/fee/feeDetail?feeId=' + scope.row.feeId"> | 242 | + <a target="_blank" :href="'/#/views/fee/feeDetail?feeId=' + scope.row.feeId"> |
| 243 | {{ $t('simplifyRoomFee.details') }} | 243 | {{ $t('simplifyRoomFee.details') }} |
| 244 | </a> | 244 | </a> |
| 245 | </template> | 245 | </template> |
src/components/simplify/simplifyCarFee.vue
| @@ -87,7 +87,7 @@ | @@ -87,7 +87,7 @@ | ||
| 87 | {{ $t('simplifyCarFee.feeChange') }} | 87 | {{ $t('simplifyCarFee.feeChange') }} |
| 88 | </el-dropdown-item> | 88 | </el-dropdown-item> |
| 89 | <el-dropdown-item> | 89 | <el-dropdown-item> |
| 90 | - <a target="_blank" :href="'/#/pages/fee/feeDetail?feeId='+row.feeId"> | 90 | + <a target="_blank" :href="'/#/views/fee/feeDetail?feeId='+row.feeId"> |
| 91 | {{ $t('simplifyCarFee.details') }} | 91 | {{ $t('simplifyCarFee.details') }} |
| 92 | </a> | 92 | </a> |
| 93 | </el-dropdown-item> | 93 | </el-dropdown-item> |
src/i18n/feeI18n.js
| @@ -32,6 +32,7 @@ import { messages as refundDepositFeeMessages } from '../views/fee/refundDeposit | @@ -32,6 +32,7 @@ import { messages as refundDepositFeeMessages } from '../views/fee/refundDeposit | ||
| 32 | import { messages as createFeeByComboMessages } from '../views/fee/createFeeByComboLang' | 32 | import { messages as createFeeByComboMessages } from '../views/fee/createFeeByComboLang' |
| 33 | import { messages as owePayFeeOrderMessages } from '../views/fee/owePayFeeOrderLang' | 33 | import { messages as owePayFeeOrderMessages } from '../views/fee/owePayFeeOrderLang' |
| 34 | import { messages as printOweFeeMessages } from '../views/fee/printOweFeeLang' | 34 | import { messages as printOweFeeMessages } from '../views/fee/printOweFeeLang' |
| 35 | +import { messages as feeDetailMessages } from '../views/fee/feeDetailLang' | ||
| 35 | 36 | ||
| 36 | export const messages = { | 37 | export const messages = { |
| 37 | en: { | 38 | en: { |
| @@ -69,6 +70,7 @@ export const messages = { | @@ -69,6 +70,7 @@ export const messages = { | ||
| 69 | ...createFeeByComboMessages.en, | 70 | ...createFeeByComboMessages.en, |
| 70 | ...owePayFeeOrderMessages.en, | 71 | ...owePayFeeOrderMessages.en, |
| 71 | ...printOweFeeMessages.en, | 72 | ...printOweFeeMessages.en, |
| 73 | + ...feeDetailMessages.en, | ||
| 72 | }, | 74 | }, |
| 73 | zh: { | 75 | zh: { |
| 74 | ...contractCreateFeeMessages.zh, | 76 | ...contractCreateFeeMessages.zh, |
| @@ -105,5 +107,6 @@ export const messages = { | @@ -105,5 +107,6 @@ export const messages = { | ||
| 105 | ...createFeeByComboMessages.zh, | 107 | ...createFeeByComboMessages.zh, |
| 106 | ...owePayFeeOrderMessages.zh, | 108 | ...owePayFeeOrderMessages.zh, |
| 107 | ...printOweFeeMessages.zh, | 109 | ...printOweFeeMessages.zh, |
| 110 | + ...feeDetailMessages.zh, | ||
| 108 | } | 111 | } |
| 109 | } | 112 | } |
| 110 | \ No newline at end of file | 113 | \ No newline at end of file |
src/router/feeRouter.js
| @@ -154,5 +154,10 @@ export default [ | @@ -154,5 +154,10 @@ export default [ | ||
| 154 | name: '/views/fee/printOweFee', | 154 | name: '/views/fee/printOweFee', |
| 155 | component: () => import('@/views/fee/printOweFeeList.vue') | 155 | component: () => import('@/views/fee/printOweFeeList.vue') |
| 156 | }, | 156 | }, |
| 157 | + { | ||
| 158 | + path: '/views/fee/feeDetail', | ||
| 159 | + name: '/views/fee/feeDetail', | ||
| 160 | + component: () => import('@/views/fee/feeDetail.vue') | ||
| 161 | + }, | ||
| 157 | 162 | ||
| 158 | ] | 163 | ] |
| 159 | \ No newline at end of file | 164 | \ No newline at end of file |
src/views/fee/feeConfigManageList.vue
src/views/fee/feeDetail.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="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('feeDetail.title') }} | ||
| 7 | + </div> | ||
| 8 | + </div> | ||
| 9 | + | ||
| 10 | + <!-- 费用信息 --> | ||
| 11 | + <div class="margin-top"> | ||
| 12 | + <el-row> | ||
| 13 | + <el-col :span="24"> | ||
| 14 | + <el-row> | ||
| 15 | + <el-col :span="6"> | ||
| 16 | + <div class="form-group"> | ||
| 17 | + <label class="col-form-label"> | ||
| 18 | + {{ $t('feeDetail.feeId') }} | ||
| 19 | + </label> | ||
| 20 | + <label>{{ feeDetailInfo.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('feeDetail.feeFlag') }} | ||
| 27 | + </label> | ||
| 28 | + <label>{{ feeDetailInfo.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('feeDetail.feeType') }} | ||
| 35 | + </label> | ||
| 36 | + <label>{{ feeDetailInfo.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('feeDetail.payerObj') }} | ||
| 43 | + </label> | ||
| 44 | + <label>{{ feeDetailInfo.payerObjName || '-' }}</label> | ||
| 45 | + </div> | ||
| 46 | + </el-col> | ||
| 47 | + </el-row> | ||
| 48 | + | ||
| 49 | + <el-row> | ||
| 50 | + <el-col :span="6"> | ||
| 51 | + <div class="form-group"> | ||
| 52 | + <label class="col-form-label"> | ||
| 53 | + {{ $t('feeDetail.feeItem') }} | ||
| 54 | + </label> | ||
| 55 | + <label>{{ feeDetailInfo.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('feeDetail.feeStatus') }} | ||
| 62 | + </label> | ||
| 63 | + <label>{{ feeDetailInfo.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('feeDetail.createTime') }} | ||
| 70 | + </label> | ||
| 71 | + <label>{{ feeDetailInfo.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('feeDetail.batchId') }} | ||
| 78 | + </label> | ||
| 79 | + <label>{{ feeDetailInfo.batchId }}</label> | ||
| 80 | + </div> | ||
| 81 | + </el-col> | ||
| 82 | + </el-row> | ||
| 83 | + | ||
| 84 | + <el-row> | ||
| 85 | + <el-col :span="6"> | ||
| 86 | + <div class="form-group"> | ||
| 87 | + <label class="col-form-label"> | ||
| 88 | + {{ $t('feeDetail.startTime') }} | ||
| 89 | + </label> | ||
| 90 | + <label>{{ getEndTime(feeDetailInfo) }}</label> | ||
| 91 | + </div> | ||
| 92 | + </el-col> | ||
| 93 | + <el-col :span="6"> | ||
| 94 | + <div class="form-group"> | ||
| 95 | + <label class="col-form-label"> | ||
| 96 | + {{ $t('feeDetail.endTime') }} | ||
| 97 | + </label> | ||
| 98 | + <label>{{ getDeadlineTime(feeDetailInfo) }}</label> | ||
| 99 | + </div> | ||
| 100 | + </el-col> | ||
| 101 | + <el-col :span="6"> | ||
| 102 | + <div class="form-group"> | ||
| 103 | + <label class="col-form-label"> | ||
| 104 | + {{ $t('feeDetail.owedAmount') }} | ||
| 105 | + </label> | ||
| 106 | + <label>{{ feeDetailInfo.amountOwed }}</label> | ||
| 107 | + </div> | ||
| 108 | + </el-col> | ||
| 109 | + </el-row> | ||
| 110 | + | ||
| 111 | + <el-row> | ||
| 112 | + <el-col :span="6" v-for="(item, index) in feeDetailInfo.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 | + <div class="vc-line-primary margin-top"></div> | ||
| 126 | + | ||
| 127 | + <div class="margin-top-sm"> | ||
| 128 | + <el-tabs v-model="feeDetailInfo._currentTab" @tab-click="changeTab(feeDetailInfo._currentTab)"> | ||
| 129 | + <el-tab-pane :label="$t('feeDetail.paymentRecord')" name="feeDetailHisFee"></el-tab-pane> | ||
| 130 | + <el-tab-pane :label="$t('feeDetail.monthlyView')" name="feeDetailMonthFee"></el-tab-pane> | ||
| 131 | + <el-tab-pane v-if="feeDetailInfo.payerObjType == '3333'" :label="$t('feeDetail.relatedRoom')" | ||
| 132 | + name="feeDetailRoom"> | ||
| 133 | + </el-tab-pane> | ||
| 134 | + <el-tab-pane v-if="feeDetailInfo.payerObjType == '6666'" :label="$t('feeDetail.relatedCar')" | ||
| 135 | + name="feeDetailCar"> | ||
| 136 | + </el-tab-pane> | ||
| 137 | + <el-tab-pane v-if="feeDetailInfo.payerObjType == '7777'" :label="$t('feeDetail.relatedContract')" | ||
| 138 | + name="feeDetailContract"> | ||
| 139 | + </el-tab-pane> | ||
| 140 | + <el-tab-pane :label="$t('feeDetail.modificationRecord')" name="feeDetailHis"></el-tab-pane> | ||
| 141 | + <el-tab-pane :label="$t('feeDetail.feeItem')" name="feeDetailConfig"></el-tab-pane> | ||
| 142 | + <el-tab-pane :label="$t('feeDetail.owner')" name="feeDetailOwner"></el-tab-pane> | ||
| 143 | + <el-tab-pane :label="$t('feeDetail.sameFeeObj')" name="feeDetailFeeObj"></el-tab-pane> | ||
| 144 | + <el-tab-pane :label="$t('feeDetail.relatedMeter')" name="feeDetailMeter"></el-tab-pane> | ||
| 145 | + <el-tab-pane :label="$t('feeDetail.relatedImport')" name="feeDetailImport"></el-tab-pane> | ||
| 146 | + <el-tab-pane :label="$t('feeDetail.discountApply')" name="feeDetailDiscount"></el-tab-pane> | ||
| 147 | + <el-tab-pane :label="$t('feeDetail.reprintReceipt')" name="feeDetailReceipt"></el-tab-pane> | ||
| 148 | + <el-tab-pane v-if="feeDetailInfo.feeFlag != '2006012'" :label="$t('feeDetail.feeSplit')" | ||
| 149 | + name="feeDetailSub"></el-tab-pane> | ||
| 150 | + <el-tab-pane v-if="feeDetailInfo.feeFlag == '2006012'" :label="$t('feeDetail.billRule')" | ||
| 151 | + name="feeDetailFeeRule"></el-tab-pane> | ||
| 152 | + <el-tab-pane v-if="feeDetailInfo.feeFlag == '2006012'" :label="$t('feeDetail.feeBill')" | ||
| 153 | + name="feeDetailRuleBill"></el-tab-pane> | ||
| 154 | + </el-tabs> | ||
| 155 | + </div> | ||
| 156 | + </div> | ||
| 157 | + | ||
| 158 | + <div class="white-bg padding-left padding-right padding-top border-radius-bottom"> | ||
| 159 | + <component :is="feeDetailInfo._currentTab" :key="feeDetailInfo._currentTab" :ref="feeDetailInfo._currentTab" | ||
| 160 | + :feeId="feeDetailInfo.feeId" :payerObjId="feeDetailInfo.payerObjId" :configId="feeDetailInfo.configId" | ||
| 161 | + :state="feeDetailInfo.state" :ownerId="ownerId"> | ||
| 162 | + </component> | ||
| 163 | + </div> | ||
| 164 | + </div> | ||
| 165 | +</template> | ||
| 166 | + | ||
| 167 | +<script> | ||
| 168 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 169 | +import { getFeeDetail } from '@/api/fee/feeDetailApi' | ||
| 170 | +import FeeDetailHisFee from '@/components/fee/feeDetailHisFee' | ||
| 171 | +import FeeDetailMonthFee from '@/components/fee/feeDetailMonthFee' | ||
| 172 | +import FeeDetailRoom from '@/components/fee/feeDetailRoom' | ||
| 173 | +import FeeDetailCar from '@/components/fee/feeDetailCar' | ||
| 174 | +import FeeDetailContract from '@/components/fee/feeDetailContract' | ||
| 175 | +import FeeDetailConfig from '@/components/fee/feeDetailConfig' | ||
| 176 | +import FeeDetailHis from '@/components/fee/feeDetailHis' | ||
| 177 | +import FeeDetailOwner from '@/components/fee/feeDetailOwner' | ||
| 178 | +import FeeDetailFeeObj from '@/components/fee/FeeDetailFeeObj' | ||
| 179 | +import FeeDetailMeter from '@/components/fee/feeDetailMeter' | ||
| 180 | +import FeeDetailImport from '@/components/fee/feeDetailImport' | ||
| 181 | +import FeeDetailDiscount from '@/components/fee/feeDetailDiscount' | ||
| 182 | +import FeeDetailReceipt from '@/components/fee/feeDetailReceipt' | ||
| 183 | +import FeeDetailSub from '@/components/fee/feeDetailSub' | ||
| 184 | +import FeeDetailFeeRule from '@/components/fee/feeDetailFeeRule' | ||
| 185 | +import FeeDetailRuleBill from '@/components/fee/feeDetailRuleBill' | ||
| 186 | + | ||
| 187 | +export default { | ||
| 188 | + name: 'FeeDetail', | ||
| 189 | + components: { | ||
| 190 | + FeeDetailHisFee, | ||
| 191 | + FeeDetailMonthFee, | ||
| 192 | + FeeDetailRoom, | ||
| 193 | + FeeDetailCar, | ||
| 194 | + FeeDetailContract, | ||
| 195 | + FeeDetailConfig, | ||
| 196 | + FeeDetailHis, | ||
| 197 | + FeeDetailOwner, | ||
| 198 | + FeeDetailFeeObj, | ||
| 199 | + FeeDetailMeter, | ||
| 200 | + FeeDetailImport, | ||
| 201 | + FeeDetailDiscount, | ||
| 202 | + FeeDetailReceipt, | ||
| 203 | + FeeDetailSub, | ||
| 204 | + FeeDetailFeeRule, | ||
| 205 | + FeeDetailRuleBill | ||
| 206 | + }, | ||
| 207 | + data() { | ||
| 208 | + return { | ||
| 209 | + feeDetailInfo: { | ||
| 210 | + feeId: '', | ||
| 211 | + configId: '', | ||
| 212 | + feeFlag: '', | ||
| 213 | + feeFlagName: '', | ||
| 214 | + feeTypeCdName: '', | ||
| 215 | + payerObjName: '', | ||
| 216 | + payerObjId: '', | ||
| 217 | + payerObjType: '', | ||
| 218 | + feeName: '', | ||
| 219 | + stateName: '', | ||
| 220 | + state: '', | ||
| 221 | + startTime: '', | ||
| 222 | + batchId: '', | ||
| 223 | + endTime: '', | ||
| 224 | + deadlineTime: '', | ||
| 225 | + amountOwed: '', | ||
| 226 | + attrs: [], | ||
| 227 | + _currentTab: 'feeDetailHisFee', | ||
| 228 | + needBack: false | ||
| 229 | + }, | ||
| 230 | + communityId: '' | ||
| 231 | + } | ||
| 232 | + }, | ||
| 233 | + computed: { | ||
| 234 | + ownerId() { | ||
| 235 | + const ownerAttr = this.feeDetailInfo.attrs.find(item => item.specCd === '390007') | ||
| 236 | + return ownerAttr ? ownerAttr.value : '' | ||
| 237 | + } | ||
| 238 | + }, | ||
| 239 | + created() { | ||
| 240 | + this.communityId = getCommunityId() | ||
| 241 | + this.feeDetailInfo.feeId = this.$route.query.feeId | ||
| 242 | + if (this.feeDetailInfo.feeId) { | ||
| 243 | + this.loadFeeDetailInfo() | ||
| 244 | + } | ||
| 245 | + }, | ||
| 246 | + methods: { | ||
| 247 | + async loadFeeDetailInfo() { | ||
| 248 | + try { | ||
| 249 | + const params = { | ||
| 250 | + page: 1, | ||
| 251 | + row: 1, | ||
| 252 | + feeId: this.feeDetailInfo.feeId, | ||
| 253 | + communityId: this.communityId | ||
| 254 | + } | ||
| 255 | + const response = await getFeeDetail(params) | ||
| 256 | + const feeInfo = response.fees[0] | ||
| 257 | + Object.assign(this.feeDetailInfo, feeInfo) | ||
| 258 | + this.feeDetailInfo.attrs = feeInfo.feeAttrs || [] | ||
| 259 | + this.changeTab(this.feeDetailInfo._currentTab) | ||
| 260 | + } catch (error) { | ||
| 261 | + console.error('Failed to load fee detail:', error) | ||
| 262 | + } | ||
| 263 | + }, | ||
| 264 | + changeTab(tab) { | ||
| 265 | + this.feeDetailInfo._currentTab = tab | ||
| 266 | + setTimeout(() => { | ||
| 267 | + this.$refs[tab].open({ | ||
| 268 | + feeId: this.feeDetailInfo.feeId, | ||
| 269 | + payerObjId: this.feeDetailInfo.payerObjId, | ||
| 270 | + configId: this.feeDetailInfo.configId, | ||
| 271 | + state: this.feeDetailInfo.state, | ||
| 272 | + ownerId: this.ownerId | ||
| 273 | + }) | ||
| 274 | + },500) | ||
| 275 | + }, | ||
| 276 | + getDeadlineTime(fee) { | ||
| 277 | + if (fee.amountOwed == 0 && fee.endTime == fee.deadlineTime) { | ||
| 278 | + return "-" | ||
| 279 | + } | ||
| 280 | + if (fee.state == '2009001') { | ||
| 281 | + return "-" | ||
| 282 | + } | ||
| 283 | + return fee.deadlineTime | ||
| 284 | + }, | ||
| 285 | + getEndTime(fee) { | ||
| 286 | + if (fee.state == '2009001') { | ||
| 287 | + return "-" | ||
| 288 | + } | ||
| 289 | + return fee.endTime | ||
| 290 | + } | ||
| 291 | + } | ||
| 292 | +} | ||
| 293 | +</script> | ||
| 294 | + | ||
| 295 | +<style scoped> | ||
| 296 | +.fee-detail-container { | ||
| 297 | + background-color: #f5f5f5; | ||
| 298 | + padding: 20px; | ||
| 299 | +} | ||
| 300 | + | ||
| 301 | +.white-bg { | ||
| 302 | + background-color: white; | ||
| 303 | +} | ||
| 304 | + | ||
| 305 | +.padding-left { | ||
| 306 | + padding-left: 15px; | ||
| 307 | +} | ||
| 308 | + | ||
| 309 | +.padding-right { | ||
| 310 | + padding-right: 15px; | ||
| 311 | +} | ||
| 312 | + | ||
| 313 | +.padding-top { | ||
| 314 | + padding-top: 15px; | ||
| 315 | +} | ||
| 316 | + | ||
| 317 | +.border-radius-top { | ||
| 318 | + border-radius: 4px 4px 0 0; | ||
| 319 | +} | ||
| 320 | + | ||
| 321 | +.border-radius-bottom { | ||
| 322 | + border-radius: 0 0 4px 4px; | ||
| 323 | +} | ||
| 324 | + | ||
| 325 | +.flex { | ||
| 326 | + display: flex; | ||
| 327 | +} | ||
| 328 | + | ||
| 329 | +.justify-between { | ||
| 330 | + justify-content: space-between; | ||
| 331 | +} | ||
| 332 | + | ||
| 333 | +.text-title { | ||
| 334 | + font-size: 18px; | ||
| 335 | + font-weight: bold; | ||
| 336 | +} | ||
| 337 | + | ||
| 338 | +.margin-top { | ||
| 339 | + margin-top: 15px; | ||
| 340 | +} | ||
| 341 | + | ||
| 342 | +.margin-top-sm { | ||
| 343 | + margin-top: 10px; | ||
| 344 | +} | ||
| 345 | + | ||
| 346 | +.form-group { | ||
| 347 | + margin-bottom: 15px; | ||
| 348 | + text-align: left; | ||
| 349 | +} | ||
| 350 | + | ||
| 351 | +.col-form-label { | ||
| 352 | + margin-bottom: 5px; | ||
| 353 | +} | ||
| 354 | + | ||
| 355 | +.vc-line-primary { | ||
| 356 | + height: 1px; | ||
| 357 | + background-color: #e8e8e8; | ||
| 358 | +} | ||
| 359 | +</style> | ||
| 0 | \ No newline at end of file | 360 | \ No newline at end of file |
src/views/fee/feeDetailCarLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailCar: { | ||
| 4 | + licensePlate: 'License Plate', | ||
| 5 | + licenseType: 'License Type', | ||
| 6 | + carType: 'Car Type', | ||
| 7 | + color: 'Color', | ||
| 8 | + owner: 'Owner', | ||
| 9 | + parkingSpace: 'Parking Space', | ||
| 10 | + validityPeriod: 'Validity Period', | ||
| 11 | + temporaryCar: 'Temporary Car', | ||
| 12 | + parkingLot: 'Parking Lot', | ||
| 13 | + spaceReleased: 'Space Released' | ||
| 14 | + }, | ||
| 15 | + feeDetailCarDemo: { | ||
| 16 | + openComponent: 'Open Car Detail' | ||
| 17 | + } | ||
| 18 | + }, | ||
| 19 | + zh: { | ||
| 20 | + feeDetailCar: { | ||
| 21 | + licensePlate: '车牌号', | ||
| 22 | + licenseType: '车牌类型', | ||
| 23 | + carType: '车辆类型', | ||
| 24 | + color: '颜色', | ||
| 25 | + owner: '业主', | ||
| 26 | + parkingSpace: '车位', | ||
| 27 | + validityPeriod: '有效期', | ||
| 28 | + temporaryCar: '临时车', | ||
| 29 | + parkingLot: '车场', | ||
| 30 | + spaceReleased: '车位已释放' | ||
| 31 | + }, | ||
| 32 | + feeDetailCarDemo: { | ||
| 33 | + openComponent: '打开车辆详情' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
src/views/fee/feeDetailConfigLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailConfig: { | ||
| 4 | + feeType: 'Fee Type', | ||
| 5 | + feeItem: 'Fee Item', | ||
| 6 | + feeFlag: 'Fee Flag', | ||
| 7 | + reminderType: 'Reminder Type', | ||
| 8 | + paymentType: 'Payment Type', | ||
| 9 | + paymentCycle: 'Payment Cycle', | ||
| 10 | + unit: 'Unit', | ||
| 11 | + formula: 'Formula', | ||
| 12 | + unitPrice: 'Unit Price', | ||
| 13 | + additionalFee: 'Additional/Fixed Fee', | ||
| 14 | + accountDeduction: 'Account Deduction', | ||
| 15 | + mobilePayment: 'Mobile Payment', | ||
| 16 | + decimalPlaces: 'Decimal Places', | ||
| 17 | + prepaid: 'Prepaid', | ||
| 18 | + postpaid: 'Postpaid', | ||
| 19 | + yes: 'Yes', | ||
| 20 | + no: 'No' | ||
| 21 | + }, | ||
| 22 | + feeDetailConfigDemo: { | ||
| 23 | + openComponent: 'Open Config Detail' | ||
| 24 | + } | ||
| 25 | + }, | ||
| 26 | + zh: { | ||
| 27 | + feeDetailConfig: { | ||
| 28 | + feeType: '费用类型', | ||
| 29 | + feeItem: '收费项目', | ||
| 30 | + feeFlag: '费用标识', | ||
| 31 | + reminderType: '催缴类型', | ||
| 32 | + paymentType: '付费类型', | ||
| 33 | + paymentCycle: '缴费周期', | ||
| 34 | + unit: '单位', | ||
| 35 | + formula: '公式', | ||
| 36 | + unitPrice: '计费单价', | ||
| 37 | + additionalFee: '附加/固定费用', | ||
| 38 | + accountDeduction: '账户抵扣', | ||
| 39 | + mobilePayment: '手机缴费', | ||
| 40 | + decimalPlaces: '保留小数位', | ||
| 41 | + prepaid: '预付费', | ||
| 42 | + postpaid: '后付费', | ||
| 43 | + yes: '是', | ||
| 44 | + no: '否' | ||
| 45 | + }, | ||
| 46 | + feeDetailConfigDemo: { | ||
| 47 | + openComponent: '打开配置详情' | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | +} | ||
| 0 | \ No newline at end of file | 51 | \ No newline at end of file |
src/views/fee/feeDetailContractLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailContract: { | ||
| 4 | + contractName: 'Contract Name', | ||
| 5 | + contractCode: 'Contract Code', | ||
| 6 | + parentContractCode: 'Parent Contract Code', | ||
| 7 | + contractType: 'Contract Type', | ||
| 8 | + operator: 'Operator', | ||
| 9 | + contractAmount: 'Contract Amount', | ||
| 10 | + startTime: 'Start Time', | ||
| 11 | + endTime: 'End Time', | ||
| 12 | + draftTime: 'Draft Time', | ||
| 13 | + status: 'Status' | ||
| 14 | + }, | ||
| 15 | + feeDetailContractDemo: { | ||
| 16 | + openComponent: 'Open Contract Detail' | ||
| 17 | + } | ||
| 18 | + }, | ||
| 19 | + zh: { | ||
| 20 | + feeDetailContract: { | ||
| 21 | + contractName: '合同名称', | ||
| 22 | + contractCode: '合同编号', | ||
| 23 | + parentContractCode: '父合同编号', | ||
| 24 | + contractType: '合同类型', | ||
| 25 | + operator: '经办人', | ||
| 26 | + contractAmount: '合同金额', | ||
| 27 | + startTime: '开始时间', | ||
| 28 | + endTime: '结束时间', | ||
| 29 | + draftTime: '起草时间', | ||
| 30 | + status: '状态' | ||
| 31 | + }, | ||
| 32 | + feeDetailContractDemo: { | ||
| 33 | + openComponent: '打开合同详情' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
src/views/fee/feeDetailDiscountLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailDiscount: { | ||
| 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 | + feeDetailDiscount: { | ||
| 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/fee/feeDetailHisFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailHisFee: { | ||
| 4 | + feeName: 'Fee Item', | ||
| 5 | + payerObjName: 'Charge Object', | ||
| 6 | + cycles: 'Cycle (Unit: Month)', | ||
| 7 | + amount: 'Receivable/Received (Unit: Yuan)', | ||
| 8 | + paymentMethod: 'Payment Method', | ||
| 9 | + paymentPeriod: 'Payment Period', | ||
| 10 | + paymentTime: 'Payment Time', | ||
| 11 | + cashier: 'Cashier', | ||
| 12 | + status: 'Status', | ||
| 13 | + remark: 'Remark', | ||
| 14 | + operation: 'Operation', | ||
| 15 | + detail: 'Detail', | ||
| 16 | + accountDeduction: 'Account Deduction' | ||
| 17 | + }, | ||
| 18 | + feeDetailHisFeeDemo: { | ||
| 19 | + openComponent: 'Open Fee Detail History' | ||
| 20 | + } | ||
| 21 | + }, | ||
| 22 | + zh: { | ||
| 23 | + feeDetailHisFee: { | ||
| 24 | + feeName: '费用项', | ||
| 25 | + payerObjName: '收费对象', | ||
| 26 | + cycles: '周期(单位:月)', | ||
| 27 | + amount: '应收/实收(单位:元)', | ||
| 28 | + paymentMethod: '缴费方式', | ||
| 29 | + paymentPeriod: '缴费起始段', | ||
| 30 | + paymentTime: '缴费时间', | ||
| 31 | + cashier: '收银员', | ||
| 32 | + status: '状态', | ||
| 33 | + remark: '备注', | ||
| 34 | + operation: '操作', | ||
| 35 | + detail: '详情', | ||
| 36 | + accountDeduction: '账户扣款' | ||
| 37 | + }, | ||
| 38 | + feeDetailHisFeeDemo: { | ||
| 39 | + openComponent: '打开历史费用详情' | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | +} | ||
| 0 | \ No newline at end of file | 43 | \ No newline at end of file |
src/views/fee/feeDetailHisLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailHis: { | ||
| 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 | + feeDetailHis: { | ||
| 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/fee/feeDetailImportLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailImport: { | ||
| 4 | + floorNum: 'Building No.', | ||
| 5 | + unitNum: 'Unit No.', | ||
| 6 | + roomNum: 'Room No.', | ||
| 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 | + feeDetailImport: { | ||
| 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/fee/feeDetailLang.js
0 → 100644
| 1 | + | ||
| 2 | +export const messages = { | ||
| 3 | + en: { | ||
| 4 | + feeDetail: { | ||
| 5 | + title: 'Fee Information', | ||
| 6 | + feeId: 'Fee ID:', | ||
| 7 | + feeFlag: 'Fee Flag:', | ||
| 8 | + feeType: 'Fee Type:', | ||
| 9 | + payerObj: 'Payer:', | ||
| 10 | + feeItem: 'Fee Item:', | ||
| 11 | + feeStatus: 'Fee Status:', | ||
| 12 | + createTime: 'Create Time:', | ||
| 13 | + batchId: 'Batch:', | ||
| 14 | + startTime: 'Start Time:', | ||
| 15 | + endTime: 'End Time:', | ||
| 16 | + owedAmount: 'Owed Amount:', | ||
| 17 | + paymentRecord: 'Payment Records', | ||
| 18 | + monthlyView: 'Monthly View', | ||
| 19 | + relatedRoom: 'Related Rooms', | ||
| 20 | + relatedCar: 'Related Cars', | ||
| 21 | + relatedContract: 'Related Contracts', | ||
| 22 | + modificationRecord: 'Modification Records', | ||
| 23 | + owner: 'Owner', | ||
| 24 | + sameFeeObj: 'Same Fee Objects', | ||
| 25 | + relatedMeter: 'Related Meters', | ||
| 26 | + relatedImport: 'Related Imports', | ||
| 27 | + discountApply: 'Discount Application', | ||
| 28 | + reprintReceipt: 'Reprint Receipt', | ||
| 29 | + feeSplit: 'Fee Split', | ||
| 30 | + billRule: 'Bill Rules', | ||
| 31 | + feeBill: 'Fee Bills' | ||
| 32 | + }, | ||
| 33 | + feeDetailHisFee: { | ||
| 34 | + feeName: 'Fee Item', | ||
| 35 | + payerObjName: 'Charge Object', | ||
| 36 | + cycles: 'Cycle (Unit: Month)', | ||
| 37 | + amount: 'Receivable/Received (Unit: Yuan)', | ||
| 38 | + paymentMethod: 'Payment Method', | ||
| 39 | + paymentPeriod: 'Payment Period', | ||
| 40 | + paymentTime: 'Payment Time', | ||
| 41 | + cashier: 'Cashier', | ||
| 42 | + status: 'Status', | ||
| 43 | + remark: 'Remark', | ||
| 44 | + operation: 'Operation', | ||
| 45 | + detail: 'Detail', | ||
| 46 | + accountDeduction: 'Account Deduction' | ||
| 47 | + }, | ||
| 48 | + feeDetailHisFeeDemo: { | ||
| 49 | + openComponent: 'Open Fee Detail History' | ||
| 50 | + }, | ||
| 51 | + feeDetailMonthFee: { | ||
| 52 | + feeItem: 'Fee Item', | ||
| 53 | + feeFlag: 'Fee Flag', | ||
| 54 | + feeType: 'Fee Type', | ||
| 55 | + chargeYearMonth: 'Charge Year-Month', | ||
| 56 | + receivableAmount: 'Receivable Amount', | ||
| 57 | + description: 'Description', | ||
| 58 | + lastDegrees: 'Last Degrees:', | ||
| 59 | + currentDegrees: 'Current Degrees:', | ||
| 60 | + unitPrice: 'Unit Price:', | ||
| 61 | + additionalFee: 'Additional Fee:', | ||
| 62 | + usage: 'Usage:', | ||
| 63 | + algorithm: 'Algorithm:', | ||
| 64 | + fixedFee: 'Fixed Fee:' | ||
| 65 | + }, | ||
| 66 | + feeDetailMonthFeeDemo: { | ||
| 67 | + openComponent: 'Open Month Fee Detail' | ||
| 68 | + }, | ||
| 69 | + feeDetailRoom: { | ||
| 70 | + roomId: 'Room ID', | ||
| 71 | + floor: 'Floor', | ||
| 72 | + type: 'Type', | ||
| 73 | + area: 'Built-up/Indoor Area', | ||
| 74 | + rent: 'Rent', | ||
| 75 | + roomStatus: 'Room Status', | ||
| 76 | + roomArrears: 'Room Arrears', | ||
| 77 | + operation: 'Operation', | ||
| 78 | + businessAcceptance: 'Business Acceptance', | ||
| 79 | + updateDaily: 'Updated Daily', | ||
| 80 | + searchPlaceholder: 'Please enter room number like 1-1-1' | ||
| 81 | + }, | ||
| 82 | + feeDetailRoomDemo: { | ||
| 83 | + openComponent: 'Open Room Detail' | ||
| 84 | + }, | ||
| 85 | + feeDetailCar: { | ||
| 86 | + licensePlate: 'License Plate', | ||
| 87 | + licenseType: 'License Type', | ||
| 88 | + carType: 'Car Type', | ||
| 89 | + color: 'Color', | ||
| 90 | + owner: 'Owner', | ||
| 91 | + parkingSpace: 'Parking Space', | ||
| 92 | + validityPeriod: 'Validity Period', | ||
| 93 | + temporaryCar: 'Temporary Car', | ||
| 94 | + parkingLot: 'Parking Lot', | ||
| 95 | + spaceReleased: 'Space Released' | ||
| 96 | + }, | ||
| 97 | + feeDetailCarDemo: { | ||
| 98 | + openComponent: 'Open Car Detail' | ||
| 99 | + }, | ||
| 100 | + feeDetailContract: { | ||
| 101 | + contractName: 'Contract Name', | ||
| 102 | + contractCode: 'Contract Code', | ||
| 103 | + parentContractCode: 'Parent Contract Code', | ||
| 104 | + contractType: 'Contract Type', | ||
| 105 | + operator: 'Operator', | ||
| 106 | + contractAmount: 'Contract Amount', | ||
| 107 | + startTime: 'Start Time', | ||
| 108 | + endTime: 'End Time', | ||
| 109 | + draftTime: 'Draft Time', | ||
| 110 | + status: 'Status' | ||
| 111 | + }, | ||
| 112 | + feeDetailContractDemo: { | ||
| 113 | + openComponent: 'Open Contract Detail' | ||
| 114 | + }, | ||
| 115 | + feeDetailConfig: { | ||
| 116 | + feeType: 'Fee Type', | ||
| 117 | + feeItem: 'Fee Item', | ||
| 118 | + feeFlag: 'Fee Flag', | ||
| 119 | + reminderType: 'Reminder Type', | ||
| 120 | + paymentType: 'Payment Type', | ||
| 121 | + paymentCycle: 'Payment Cycle', | ||
| 122 | + unit: 'Unit', | ||
| 123 | + formula: 'Formula', | ||
| 124 | + unitPrice: 'Unit Price', | ||
| 125 | + additionalFee: 'Additional/Fixed Fee', | ||
| 126 | + accountDeduction: 'Account Deduction', | ||
| 127 | + mobilePayment: 'Mobile Payment', | ||
| 128 | + decimalPlaces: 'Decimal Places', | ||
| 129 | + prepaid: 'Prepaid', | ||
| 130 | + postpaid: 'Postpaid', | ||
| 131 | + yes: 'Yes', | ||
| 132 | + no: 'No' | ||
| 133 | + }, | ||
| 134 | + feeDetailConfigDemo: { | ||
| 135 | + openComponent: 'Open Config Detail' | ||
| 136 | + }, | ||
| 137 | + feeDetailHis: { | ||
| 138 | + feeName: 'Fee Item', | ||
| 139 | + startTime: 'Account Time', | ||
| 140 | + endTime: 'Billing Start Time', | ||
| 141 | + operation: 'Action', | ||
| 142 | + operator: 'Operator', | ||
| 143 | + operationTime: 'Operation Time', | ||
| 144 | + add: 'Add', | ||
| 145 | + delete: 'Delete', | ||
| 146 | + modifyNew: 'Modify(New)', | ||
| 147 | + modifyOld: 'Modify(Old)' | ||
| 148 | + }, | ||
| 149 | + feeDetailOwner: { | ||
| 150 | + ownerFace: 'Owner Face', | ||
| 151 | + name: 'Name', | ||
| 152 | + gender: 'Gender', | ||
| 153 | + male: 'Male', | ||
| 154 | + female: 'Female', | ||
| 155 | + idCard: 'ID Card', | ||
| 156 | + address: 'Address', | ||
| 157 | + roomCount: 'Room Count', | ||
| 158 | + memberCount: 'Member Count', | ||
| 159 | + carCount: 'Car Count', | ||
| 160 | + complaintCount: 'Complaint', | ||
| 161 | + repairCount: 'Repair', | ||
| 162 | + oweFee: 'Owe Fee', | ||
| 163 | + contractCount: 'Contract' | ||
| 164 | + }, | ||
| 165 | + feeDetailMeter: { | ||
| 166 | + meterId: 'Meter ID', | ||
| 167 | + meterType: 'Meter Type', | ||
| 168 | + objName: 'Object Name', | ||
| 169 | + preDegrees: 'Previous Degree', | ||
| 170 | + curDegrees: 'Current Degree', | ||
| 171 | + preReadingTime: 'Previous Reading Time', | ||
| 172 | + curReadingTime: 'Current Reading Time', | ||
| 173 | + createTime: 'Create Time' | ||
| 174 | + }, | ||
| 175 | + feeDetailImport: { | ||
| 176 | + floorNum: 'Building No.', | ||
| 177 | + unitNum: 'Unit No.', | ||
| 178 | + roomNum: 'Room No.', | ||
| 179 | + feeName: 'Fee Name', | ||
| 180 | + startTime: 'Start Time', | ||
| 181 | + endTime: 'End Time', | ||
| 182 | + totalAmount: 'Total Amount', | ||
| 183 | + remark: 'Remark', | ||
| 184 | + status: 'Status', | ||
| 185 | + importSuccess: 'Import Success', | ||
| 186 | + importFailed: 'Import Failed' | ||
| 187 | + }, | ||
| 188 | + feeDetailDiscount: { | ||
| 189 | + roomName: 'Room(Building-Unit-Room)', | ||
| 190 | + discountId: 'Discount ID', | ||
| 191 | + discountName: 'Discount Name', | ||
| 192 | + applyType: 'Apply Type', | ||
| 193 | + applicant: 'Applicant', | ||
| 194 | + applicantPhone: 'Applicant Phone', | ||
| 195 | + startTime: 'Start Time', | ||
| 196 | + endTime: 'End Time', | ||
| 197 | + status: 'Status', | ||
| 198 | + createTime: 'Create Time', | ||
| 199 | + useStatus: 'Use Status', | ||
| 200 | + notUsed: 'Not Used', | ||
| 201 | + used: 'Used', | ||
| 202 | + returnType: 'Return Type', | ||
| 203 | + accountBalance: 'Account Balance', | ||
| 204 | + discount: 'Discount', | ||
| 205 | + returnAmount: 'Return Amount' | ||
| 206 | + }, | ||
| 207 | + feeDetailReceipt: { | ||
| 208 | + print: 'Print', | ||
| 209 | + printSmall: 'Print Small', | ||
| 210 | + printApply: 'Print Apply', | ||
| 211 | + feeType: 'Fee Type', | ||
| 212 | + owner: 'Owner', | ||
| 213 | + feeItem: 'Fee Item', | ||
| 214 | + feePeriod: 'Fee Period', | ||
| 215 | + totalAmount: 'Total Amount', | ||
| 216 | + paymentTime: 'Payment Time', | ||
| 217 | + receiptId: 'Receipt ID', | ||
| 218 | + yuan: 'Yuan', | ||
| 219 | + selectPrintReceipt: 'Please select receipt to print', | ||
| 220 | + selectPrintApply: 'Please select' | ||
| 221 | + }, | ||
| 222 | + mergeFee: { | ||
| 223 | + confirmOperation: 'Please confirm your operation!', | ||
| 224 | + mergeDescription: 'Merge split fees. After merging, the split fees will be ended and the original fee will be enabled', | ||
| 225 | + cancel: 'Cancel', | ||
| 226 | + confirmMerge: 'Confirm Merge', | ||
| 227 | + mergeSuccess: 'Merge successful, please check the merged fee in business processing' | ||
| 228 | + }, | ||
| 229 | + mergeFeeDemo: { | ||
| 230 | + openComponent: 'Open Merge Fee Component', | ||
| 231 | + mergeSuccess: 'Merge operation completed successfully' | ||
| 232 | + }, | ||
| 233 | + feeDetailSub: { | ||
| 234 | + split: 'Split', | ||
| 235 | + parentFeeId: 'Parent Fee ID', | ||
| 236 | + childFeeId: 'Child Fee ID', | ||
| 237 | + feeName: 'Fee Name', | ||
| 238 | + feeObject: 'Fee Object', | ||
| 239 | + billingPeriod: 'Billing Period', | ||
| 240 | + splitTime: 'Split Time', | ||
| 241 | + operation: 'Operation', | ||
| 242 | + restoreMerge: 'Restore Merge' | ||
| 243 | + }, | ||
| 244 | + feeDetailSubDemo: { | ||
| 245 | + openComponent: 'Open Fee Detail Sub Component' | ||
| 246 | + } | ||
| 247 | + }, | ||
| 248 | + zh: { | ||
| 249 | + feeDetail: { | ||
| 250 | + title: '费用信息', | ||
| 251 | + feeId: '费用ID:', | ||
| 252 | + feeFlag: '费用标识:', | ||
| 253 | + feeType: '费用类型:', | ||
| 254 | + payerObj: '付费对象:', | ||
| 255 | + feeItem: '费用项:', | ||
| 256 | + feeStatus: '费用状态:', | ||
| 257 | + createTime: '建账时间:', | ||
| 258 | + batchId: '批次:', | ||
| 259 | + startTime: '应收开始时间:', | ||
| 260 | + endTime: '应收结束时间:', | ||
| 261 | + owedAmount: '欠费金额:', | ||
| 262 | + paymentRecord: '缴费记录', | ||
| 263 | + monthlyView: '按月展示', | ||
| 264 | + relatedRoom: '关联房屋', | ||
| 265 | + relatedCar: '关联车辆', | ||
| 266 | + relatedContract: '关联合同', | ||
| 267 | + modificationRecord: '修改记录', | ||
| 268 | + owner: '业主', | ||
| 269 | + sameFeeObj: '同费用对象', | ||
| 270 | + relatedMeter: '关联抄表', | ||
| 271 | + relatedImport: '关联导入', | ||
| 272 | + discountApply: '优惠申请', | ||
| 273 | + reprintReceipt: '补打收据', | ||
| 274 | + feeSplit: '费用拆分', | ||
| 275 | + billRule: '账单规则', | ||
| 276 | + feeBill: '费用账单' | ||
| 277 | + }, | ||
| 278 | + feeDetailHisFee: { | ||
| 279 | + feeName: '费用项', | ||
| 280 | + payerObjName: '收费对象', | ||
| 281 | + cycles: '周期(单位:月)', | ||
| 282 | + amount: '应收/实收(单位:元)', | ||
| 283 | + paymentMethod: '缴费方式', | ||
| 284 | + paymentPeriod: '缴费起始段', | ||
| 285 | + paymentTime: '缴费时间', | ||
| 286 | + cashier: '收银员', | ||
| 287 | + status: '状态', | ||
| 288 | + remark: '备注', | ||
| 289 | + operation: '操作', | ||
| 290 | + detail: '详情', | ||
| 291 | + accountDeduction: '账户扣款' | ||
| 292 | + }, | ||
| 293 | + feeDetailHisFeeDemo: { | ||
| 294 | + openComponent: '打开历史费用详情' | ||
| 295 | + }, | ||
| 296 | + feeDetailMonthFee: { | ||
| 297 | + feeItem: '费用项目', | ||
| 298 | + feeFlag: '费用标识', | ||
| 299 | + feeType: '费用类型', | ||
| 300 | + chargeYearMonth: '收费年月', | ||
| 301 | + receivableAmount: '应收金额', | ||
| 302 | + description: '说明', | ||
| 303 | + lastDegrees: '上期度数:', | ||
| 304 | + currentDegrees: '本期度数:', | ||
| 305 | + unitPrice: '单价:', | ||
| 306 | + additionalFee: '附加费:', | ||
| 307 | + usage: '用量:', | ||
| 308 | + algorithm: '算法:', | ||
| 309 | + fixedFee: '固定费:' | ||
| 310 | + }, | ||
| 311 | + feeDetailMonthFeeDemo: { | ||
| 312 | + openComponent: '打开月度费用详情' | ||
| 313 | + }, | ||
| 314 | + feeDetailRoom: { | ||
| 315 | + roomId: '房屋ID', | ||
| 316 | + floor: '楼层', | ||
| 317 | + type: '类型', | ||
| 318 | + area: '建筑/室内面积', | ||
| 319 | + rent: '租金', | ||
| 320 | + roomStatus: '房屋状态', | ||
| 321 | + roomArrears: '房屋欠费', | ||
| 322 | + operation: '操作', | ||
| 323 | + businessAcceptance: '业务受理', | ||
| 324 | + updateDaily: '按天更新', | ||
| 325 | + searchPlaceholder: '请输入房屋编号 楼栋-单元-房屋 如1-1-1' | ||
| 326 | + }, | ||
| 327 | + feeDetailRoomDemo: { | ||
| 328 | + openComponent: '打开房屋详情' | ||
| 329 | + }, | ||
| 330 | + feeDetailCar: { | ||
| 331 | + licensePlate: '车牌号', | ||
| 332 | + licenseType: '车牌类型', | ||
| 333 | + carType: '车辆类型', | ||
| 334 | + color: '颜色', | ||
| 335 | + owner: '业主', | ||
| 336 | + parkingSpace: '车位', | ||
| 337 | + validityPeriod: '有效期', | ||
| 338 | + temporaryCar: '临时车', | ||
| 339 | + parkingLot: '车场', | ||
| 340 | + spaceReleased: '车位已释放' | ||
| 341 | + }, | ||
| 342 | + feeDetailCarDemo: { | ||
| 343 | + openComponent: '打开车辆详情' | ||
| 344 | + }, | ||
| 345 | + feeDetailContract: { | ||
| 346 | + contractName: '合同名称', | ||
| 347 | + contractCode: '合同编号', | ||
| 348 | + parentContractCode: '父合同编号', | ||
| 349 | + contractType: '合同类型', | ||
| 350 | + operator: '经办人', | ||
| 351 | + contractAmount: '合同金额', | ||
| 352 | + startTime: '开始时间', | ||
| 353 | + endTime: '结束时间', | ||
| 354 | + draftTime: '起草时间', | ||
| 355 | + status: '状态' | ||
| 356 | + }, | ||
| 357 | + feeDetailContractDemo: { | ||
| 358 | + openComponent: '打开合同详情' | ||
| 359 | + }, | ||
| 360 | + feeDetailConfig: { | ||
| 361 | + feeType: '费用类型', | ||
| 362 | + feeItem: '收费项目', | ||
| 363 | + feeFlag: '费用标识', | ||
| 364 | + reminderType: '催缴类型', | ||
| 365 | + paymentType: '付费类型', | ||
| 366 | + paymentCycle: '缴费周期', | ||
| 367 | + unit: '单位', | ||
| 368 | + formula: '公式', | ||
| 369 | + unitPrice: '计费单价', | ||
| 370 | + additionalFee: '附加/固定费用', | ||
| 371 | + accountDeduction: '账户抵扣', | ||
| 372 | + mobilePayment: '手机缴费', | ||
| 373 | + decimalPlaces: '保留小数位', | ||
| 374 | + prepaid: '预付费', | ||
| 375 | + postpaid: '后付费', | ||
| 376 | + yes: '是', | ||
| 377 | + no: '否' | ||
| 378 | + }, | ||
| 379 | + feeDetailConfigDemo: { | ||
| 380 | + openComponent: '打开配置详情' | ||
| 381 | + }, | ||
| 382 | + feeDetailHis: { | ||
| 383 | + feeName: '费用项', | ||
| 384 | + startTime: '建账时间', | ||
| 385 | + endTime: '计费起始时间', | ||
| 386 | + operation: '动作', | ||
| 387 | + operator: '操作人', | ||
| 388 | + operationTime: '操作时间', | ||
| 389 | + add: '添加', | ||
| 390 | + delete: '删除', | ||
| 391 | + modifyNew: '修改(新)', | ||
| 392 | + modifyOld: '修改(旧)' | ||
| 393 | + }, | ||
| 394 | + feeDetailOwner: { | ||
| 395 | + ownerFace: '业主人脸', | ||
| 396 | + name: '姓名', | ||
| 397 | + gender: '性别', | ||
| 398 | + male: '男', | ||
| 399 | + female: '女', | ||
| 400 | + idCard: '身份证', | ||
| 401 | + address: '家庭住址', | ||
| 402 | + roomCount: '房屋数', | ||
| 403 | + memberCount: '业主成员', | ||
| 404 | + carCount: '车辆数', | ||
| 405 | + complaintCount: '投诉', | ||
| 406 | + repairCount: '报修', | ||
| 407 | + oweFee: '欠费', | ||
| 408 | + contractCount: '业主合同' | ||
| 409 | + }, | ||
| 410 | + feeDetailMeter: { | ||
| 411 | + meterId: '表ID', | ||
| 412 | + meterType: '表类型', | ||
| 413 | + objName: '对象名称', | ||
| 414 | + preDegrees: '上期度数', | ||
| 415 | + curDegrees: '本期度数', | ||
| 416 | + preReadingTime: '上期读表时间', | ||
| 417 | + curReadingTime: '本期读表时间', | ||
| 418 | + createTime: '创建时间' | ||
| 419 | + }, | ||
| 420 | + feeDetailImport: { | ||
| 421 | + floorNum: '楼栋编号', | ||
| 422 | + unitNum: '单元编号', | ||
| 423 | + roomNum: '房屋编号', | ||
| 424 | + feeName: '费用名称', | ||
| 425 | + startTime: '开始时间', | ||
| 426 | + endTime: '结束时间', | ||
| 427 | + totalAmount: '总金额', | ||
| 428 | + remark: '备注', | ||
| 429 | + status: '状态', | ||
| 430 | + importSuccess: '导入成功', | ||
| 431 | + importFailed: '导入失败' | ||
| 432 | + }, | ||
| 433 | + feeDetailDiscount: { | ||
| 434 | + roomName: '房屋(楼栋-单元-房屋)', | ||
| 435 | + discountId: '折扣ID', | ||
| 436 | + discountName: '折扣名称', | ||
| 437 | + applyType: '申请类型', | ||
| 438 | + applicant: '申请人', | ||
| 439 | + applicantPhone: '申请电话', | ||
| 440 | + startTime: '开始时间', | ||
| 441 | + endTime: '结束时间', | ||
| 442 | + status: '状态', | ||
| 443 | + createTime: '创建时间', | ||
| 444 | + useStatus: '使用状态', | ||
| 445 | + notUsed: '未使用', | ||
| 446 | + used: '已使用', | ||
| 447 | + returnType: '返还类型', | ||
| 448 | + accountBalance: '账户余额', | ||
| 449 | + discount: '折扣', | ||
| 450 | + returnAmount: '返还金额' | ||
| 451 | + }, | ||
| 452 | + feeDetailReceipt: { | ||
| 453 | + print: '打印', | ||
| 454 | + printSmall: '打印小票', | ||
| 455 | + printApply: '申请单', | ||
| 456 | + feeType: '费用类型', | ||
| 457 | + owner: '业主', | ||
| 458 | + feeItem: '费用项目', | ||
| 459 | + feePeriod: '收费时间段', | ||
| 460 | + totalAmount: '总金额', | ||
| 461 | + paymentTime: '缴费时间', | ||
| 462 | + receiptId: '收据ID', | ||
| 463 | + yuan: '元', | ||
| 464 | + selectPrintReceipt: '请选择打印收据', | ||
| 465 | + selectPrintApply: '请选择' | ||
| 466 | + }, | ||
| 467 | + mergeFee: { | ||
| 468 | + confirmOperation: '请确认您的操作!', | ||
| 469 | + mergeDescription: '合并拆分费用,合并后,将结束拆分后的费用,启用原费用', | ||
| 470 | + cancel: '点错了', | ||
| 471 | + confirmMerge: '确认合并', | ||
| 472 | + mergeSuccess: '合并成功,请到业务受理查看合并后费用' | ||
| 473 | + }, | ||
| 474 | + mergeFeeDemo: { | ||
| 475 | + openComponent: '打开合并费用组件', | ||
| 476 | + mergeSuccess: '合并操作成功完成' | ||
| 477 | + }, | ||
| 478 | + feeDetailSub: { | ||
| 479 | + split: '拆分', | ||
| 480 | + parentFeeId: '父费用ID', | ||
| 481 | + childFeeId: '子费用ID', | ||
| 482 | + feeName: '费用名称', | ||
| 483 | + feeObject: '费用对象', | ||
| 484 | + billingPeriod: '计费时间段', | ||
| 485 | + splitTime: '拆分时间', | ||
| 486 | + operation: '操作', | ||
| 487 | + restoreMerge: '恢复合并' | ||
| 488 | + }, | ||
| 489 | + feeDetailSubDemo: { | ||
| 490 | + openComponent: '打开费用子详情组件' | ||
| 491 | + } | ||
| 492 | + } | ||
| 493 | +} |
src/views/fee/feeDetailMeterLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailMeter: { | ||
| 4 | + meterId: 'Meter ID', | ||
| 5 | + meterType: 'Meter Type', | ||
| 6 | + objName: 'Object Name', | ||
| 7 | + preDegrees: 'Previous Degree', | ||
| 8 | + curDegrees: 'Current Degree', | ||
| 9 | + preReadingTime: 'Previous Reading Time', | ||
| 10 | + curReadingTime: 'Current Reading Time', | ||
| 11 | + createTime: 'Create Time' | ||
| 12 | + } | ||
| 13 | + }, | ||
| 14 | + zh: { | ||
| 15 | + feeDetailMeter: { | ||
| 16 | + meterId: '表ID', | ||
| 17 | + meterType: '表类型', | ||
| 18 | + objName: '对象名称', | ||
| 19 | + preDegrees: '上期度数', | ||
| 20 | + curDegrees: '本期度数', | ||
| 21 | + preReadingTime: '上期读表时间', | ||
| 22 | + curReadingTime: '本期读表时间', | ||
| 23 | + createTime: '创建时间' | ||
| 24 | + } | ||
| 25 | + } | ||
| 26 | +} | ||
| 0 | \ No newline at end of file | 27 | \ No newline at end of file |
src/views/fee/feeDetailMonthFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailMonthFee: { | ||
| 4 | + feeItem: 'Fee Item', | ||
| 5 | + feeFlag: 'Fee Flag', | ||
| 6 | + feeType: 'Fee Type', | ||
| 7 | + chargeYearMonth: 'Charge Year-Month', | ||
| 8 | + receivableAmount: 'Receivable Amount', | ||
| 9 | + description: 'Description', | ||
| 10 | + lastDegrees: 'Last Degrees:', | ||
| 11 | + currentDegrees: 'Current Degrees:', | ||
| 12 | + unitPrice: 'Unit Price:', | ||
| 13 | + additionalFee: 'Additional Fee:', | ||
| 14 | + usage: 'Usage:', | ||
| 15 | + algorithm: 'Algorithm:', | ||
| 16 | + fixedFee: 'Fixed Fee:' | ||
| 17 | + }, | ||
| 18 | + feeDetailMonthFeeDemo: { | ||
| 19 | + openComponent: 'Open Month Fee Detail' | ||
| 20 | + } | ||
| 21 | + }, | ||
| 22 | + zh: { | ||
| 23 | + feeDetailMonthFee: { | ||
| 24 | + feeItem: '费用项目', | ||
| 25 | + feeFlag: '费用标识', | ||
| 26 | + feeType: '费用类型', | ||
| 27 | + chargeYearMonth: '收费年月', | ||
| 28 | + receivableAmount: '应收金额', | ||
| 29 | + description: '说明', | ||
| 30 | + lastDegrees: '上期度数:', | ||
| 31 | + currentDegrees: '本期度数:', | ||
| 32 | + unitPrice: '单价:', | ||
| 33 | + additionalFee: '附加费:', | ||
| 34 | + usage: '用量:', | ||
| 35 | + algorithm: '算法:', | ||
| 36 | + fixedFee: '固定费:' | ||
| 37 | + }, | ||
| 38 | + feeDetailMonthFeeDemo: { | ||
| 39 | + openComponent: '打开月度费用详情' | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | +} | ||
| 0 | \ No newline at end of file | 43 | \ No newline at end of file |
src/views/fee/feeDetailOwnerLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailOwner: { | ||
| 4 | + ownerFace: 'Owner Face', | ||
| 5 | + name: 'Name', | ||
| 6 | + gender: 'Gender', | ||
| 7 | + male: 'Male', | ||
| 8 | + female: 'Female', | ||
| 9 | + idCard: 'ID Card', | ||
| 10 | + address: 'Address', | ||
| 11 | + roomCount: 'Room Count', | ||
| 12 | + memberCount: 'Member Count', | ||
| 13 | + carCount: 'Car Count', | ||
| 14 | + complaintCount: 'Complaint', | ||
| 15 | + repairCount: 'Repair', | ||
| 16 | + oweFee: 'Owe Fee', | ||
| 17 | + contractCount: 'Contract' | ||
| 18 | + } | ||
| 19 | + }, | ||
| 20 | + zh: { | ||
| 21 | + feeDetailOwner: { | ||
| 22 | + ownerFace: '业主人脸', | ||
| 23 | + name: '姓名', | ||
| 24 | + gender: '性别', | ||
| 25 | + male: '男', | ||
| 26 | + female: '女', | ||
| 27 | + idCard: '身份证', | ||
| 28 | + address: '家庭住址', | ||
| 29 | + roomCount: '房屋数', | ||
| 30 | + memberCount: '业主成员', | ||
| 31 | + carCount: '车辆数', | ||
| 32 | + complaintCount: '投诉', | ||
| 33 | + repairCount: '报修', | ||
| 34 | + oweFee: '欠费', | ||
| 35 | + contractCount: '业主合同' | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | +} | ||
| 0 | \ No newline at end of file | 39 | \ No newline at end of file |
src/views/fee/feeDetailReceiptLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailReceipt: { | ||
| 4 | + print: 'Print', | ||
| 5 | + printSmall: 'Print Small', | ||
| 6 | + printApply: 'Print Apply', | ||
| 7 | + feeType: 'Fee Type', | ||
| 8 | + owner: 'Owner', | ||
| 9 | + feeItem: 'Fee Item', | ||
| 10 | + feePeriod: 'Fee Period', | ||
| 11 | + totalAmount: 'Total Amount', | ||
| 12 | + paymentTime: 'Payment Time', | ||
| 13 | + receiptId: 'Receipt ID', | ||
| 14 | + yuan: 'Yuan', | ||
| 15 | + selectPrintReceipt: 'Please select receipt to print', | ||
| 16 | + selectPrintApply: 'Please select' | ||
| 17 | + } | ||
| 18 | + }, | ||
| 19 | + zh: { | ||
| 20 | + feeDetailReceipt: { | ||
| 21 | + print: '打印', | ||
| 22 | + printSmall: '打印小票', | ||
| 23 | + printApply: '申请单', | ||
| 24 | + feeType: '费用类型', | ||
| 25 | + owner: '业主', | ||
| 26 | + feeItem: '费用项目', | ||
| 27 | + feePeriod: '收费时间段', | ||
| 28 | + totalAmount: '总金额', | ||
| 29 | + paymentTime: '缴费时间', | ||
| 30 | + receiptId: '收据ID', | ||
| 31 | + yuan: '元', | ||
| 32 | + selectPrintReceipt: '请选择打印收据', | ||
| 33 | + selectPrintApply: '请选择' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
src/views/fee/feeDetailRoomLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailRoom: { | ||
| 4 | + roomId: 'Room ID', | ||
| 5 | + floor: 'Floor', | ||
| 6 | + type: 'Type', | ||
| 7 | + area: 'Built-up/Indoor Area', | ||
| 8 | + rent: 'Rent', | ||
| 9 | + roomStatus: 'Room Status', | ||
| 10 | + roomArrears: 'Room Arrears', | ||
| 11 | + operation: 'Operation', | ||
| 12 | + businessAcceptance: 'Business Acceptance', | ||
| 13 | + updateDaily: 'Updated Daily', | ||
| 14 | + searchPlaceholder: 'Please enter room number like 1-1-1' | ||
| 15 | + }, | ||
| 16 | + feeDetailRoomDemo: { | ||
| 17 | + openComponent: 'Open Room Detail' | ||
| 18 | + } | ||
| 19 | + }, | ||
| 20 | + zh: { | ||
| 21 | + feeDetailRoom: { | ||
| 22 | + roomId: '房屋ID', | ||
| 23 | + floor: '楼层', | ||
| 24 | + type: '类型', | ||
| 25 | + area: '建筑/室内面积', | ||
| 26 | + rent: '租金', | ||
| 27 | + roomStatus: '房屋状态', | ||
| 28 | + roomArrears: '房屋欠费', | ||
| 29 | + operation: '操作', | ||
| 30 | + businessAcceptance: '业务受理', | ||
| 31 | + updateDaily: '按天更新', | ||
| 32 | + searchPlaceholder: '请输入房屋编号 楼栋-单元-房屋 如1-1-1' | ||
| 33 | + }, | ||
| 34 | + feeDetailRoomDemo: { | ||
| 35 | + openComponent: '打开房屋详情' | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | +} | ||
| 0 | \ No newline at end of file | 39 | \ No newline at end of file |
src/views/fee/feeDetailSubLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + feeDetailSub: { | ||
| 4 | + split: 'Split', | ||
| 5 | + parentFeeId: 'Parent Fee ID', | ||
| 6 | + childFeeId: 'Child Fee ID', | ||
| 7 | + feeName: 'Fee Name', | ||
| 8 | + feeObject: 'Fee Object', | ||
| 9 | + billingPeriod: 'Billing Period', | ||
| 10 | + splitTime: 'Split Time', | ||
| 11 | + operation: 'Operation', | ||
| 12 | + restoreMerge: 'Restore Merge' | ||
| 13 | + }, | ||
| 14 | + feeDetailSubDemo: { | ||
| 15 | + openComponent: 'Open Fee Detail Sub Component' | ||
| 16 | + } | ||
| 17 | + }, | ||
| 18 | + zh: { | ||
| 19 | + feeDetailSub: { | ||
| 20 | + split: '拆分', | ||
| 21 | + parentFeeId: '父费用ID', | ||
| 22 | + childFeeId: '子费用ID', | ||
| 23 | + feeName: '费用名称', | ||
| 24 | + feeObject: '费用对象', | ||
| 25 | + billingPeriod: '计费时间段', | ||
| 26 | + splitTime: '拆分时间', | ||
| 27 | + operation: '操作', | ||
| 28 | + restoreMerge: '恢复合并' | ||
| 29 | + }, | ||
| 30 | + feeDetailSubDemo: { | ||
| 31 | + openComponent: '打开费用子详情组件' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | +} | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
src/views/fee/mergeFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + mergeFee: { | ||
| 4 | + confirmOperation: 'Please confirm your operation!', | ||
| 5 | + mergeDescription: 'Merge split fees. After merging, the split fees will be ended and the original fee will be enabled', | ||
| 6 | + cancel: 'Cancel', | ||
| 7 | + confirmMerge: 'Confirm Merge', | ||
| 8 | + mergeSuccess: 'Merge successful, please check the merged fee in business processing' | ||
| 9 | + }, | ||
| 10 | + mergeFeeDemo: { | ||
| 11 | + openComponent: 'Open Merge Fee Component', | ||
| 12 | + mergeSuccess: 'Merge operation completed successfully' | ||
| 13 | + } | ||
| 14 | + }, | ||
| 15 | + zh: { | ||
| 16 | + mergeFee: { | ||
| 17 | + confirmOperation: '请确认您的操作!', | ||
| 18 | + mergeDescription: '合并拆分费用,合并后,将结束拆分后的费用,启用原费用', | ||
| 19 | + cancel: '点错了', | ||
| 20 | + confirmMerge: '确认合并', | ||
| 21 | + mergeSuccess: '合并成功,请到业务受理查看合并后费用' | ||
| 22 | + }, | ||
| 23 | + mergeFeeDemo: { | ||
| 24 | + openComponent: '打开合并费用组件', | ||
| 25 | + mergeSuccess: '合并操作成功完成' | ||
| 26 | + } | ||
| 27 | + } | ||
| 28 | +} | ||
| 0 | \ No newline at end of file | 29 | \ No newline at end of file |
src/views/room/propertyRightRegistrationManageList.vue
| @@ -128,7 +128,7 @@ | @@ -128,7 +128,7 @@ | ||
| 128 | import { getDict } from '@/api/community/communityApi' | 128 | import { getDict } from '@/api/community/communityApi' |
| 129 | import { getCommunityId } from '@/api/community/communityApi' | 129 | import { getCommunityId } from '@/api/community/communityApi' |
| 130 | import { listPropertyRightRegistration } from '@/api/room/propertyRightRegistrationManageApi' | 130 | import { listPropertyRightRegistration } from '@/api/room/propertyRightRegistrationManageApi' |
| 131 | -import { queryFloors, queryUnits } from '@/api/room/roomApi' | 131 | +import { getFloors, getUnits } from '@/api/room/roomApi' |
| 132 | import AddPropertyRightRegistration from '@/components/room/addPropertyRightRegistration' | 132 | import AddPropertyRightRegistration from '@/components/room/addPropertyRightRegistration' |
| 133 | import ExaminePropertyRightRegistration from '@/components/room/examinePropertyRightRegistration' | 133 | import ExaminePropertyRightRegistration from '@/components/room/examinePropertyRightRegistration' |
| 134 | import EditPropertyRightRegistration from '@/components/room/editPropertyRightRegistration' | 134 | import EditPropertyRightRegistration from '@/components/room/editPropertyRightRegistration' |
| @@ -221,7 +221,7 @@ export default { | @@ -221,7 +221,7 @@ export default { | ||
| 221 | page: 1, | 221 | page: 1, |
| 222 | row: 50 | 222 | row: 50 |
| 223 | } | 223 | } |
| 224 | - const data = await queryFloors(params) | 224 | + const data = await getFloors(params) |
| 225 | this.floors = data.apiFloorDataVoList || [] | 225 | this.floors = data.apiFloorDataVoList || [] |
| 226 | } catch (error) { | 226 | } catch (error) { |
| 227 | console.error('获取楼栋数据失败:', error) | 227 | console.error('获取楼栋数据失败:', error) |
| @@ -235,7 +235,7 @@ export default { | @@ -235,7 +235,7 @@ export default { | ||
| 235 | page: 1, | 235 | page: 1, |
| 236 | row: 50 | 236 | row: 50 |
| 237 | } | 237 | } |
| 238 | - const data = await queryUnits(params) | 238 | + const data = await getUnits(params) |
| 239 | this.units = data || [] | 239 | this.units = data || [] |
| 240 | this.searchForm.unitId = '' | 240 | this.searchForm.unitId = '' |
| 241 | } catch (error) { | 241 | } catch (error) { |