Commit f80ea09a4594a4e242d5e0c8a790ceabcd5580b6

Authored by wuxw
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 25 \ No newline at end of file
... ...
src/components/fee/feeDetailRuleBill.vue
... ... @@ -25,7 +25,7 @@
25 25 <el-table-column :label="$t('common.operation')" align="center">
26 26 <template slot-scope="scope">
27 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 29 {{ $t('common.detail') }}
30 30 </a>
31 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 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 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 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 28 \ No newline at end of file
... ...
src/components/fee/simplifyRoomFee.vue
... ... @@ -165,7 +165,7 @@
165 165 {{ $t('simplifyRoomFee.feeChange') }}
166 166 </el-dropdown-item>
167 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 169 {{ $t('simplifyRoomFee.details') }}
170 170 </a>
171 171 </el-dropdown-item>
... ... @@ -239,7 +239,7 @@
239 239 </el-table-column>
240 240 <el-table-column :label="$t('simplifyRoomFee.operation')" align="center">
241 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 243 {{ $t('simplifyRoomFee.details') }}
244 244 </a>
245 245 </template>
... ...
src/components/simplify/simplifyCarFee.vue
... ... @@ -87,7 +87,7 @@
87 87 {{ $t('simplifyCarFee.feeChange') }}
88 88 </el-dropdown-item>
89 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 91 {{ $t('simplifyCarFee.details') }}
92 92 </a>
93 93 </el-dropdown-item>
... ...
src/i18n/feeI18n.js
... ... @@ -32,6 +32,7 @@ import { messages as refundDepositFeeMessages } from &#39;../views/fee/refundDeposit
32 32 import { messages as createFeeByComboMessages } from '../views/fee/createFeeByComboLang'
33 33 import { messages as owePayFeeOrderMessages } from '../views/fee/owePayFeeOrderLang'
34 34 import { messages as printOweFeeMessages } from '../views/fee/printOweFeeLang'
  35 +import { messages as feeDetailMessages } from '../views/fee/feeDetailLang'
35 36  
36 37 export const messages = {
37 38 en: {
... ... @@ -69,6 +70,7 @@ export const messages = {
69 70 ...createFeeByComboMessages.en,
70 71 ...owePayFeeOrderMessages.en,
71 72 ...printOweFeeMessages.en,
  73 + ...feeDetailMessages.en,
72 74 },
73 75 zh: {
74 76 ...contractCreateFeeMessages.zh,
... ... @@ -105,5 +107,6 @@ export const messages = {
105 107 ...createFeeByComboMessages.zh,
106 108 ...owePayFeeOrderMessages.zh,
107 109 ...printOweFeeMessages.zh,
  110 + ...feeDetailMessages.zh,
108 111 }
109 112 }
110 113 \ No newline at end of file
... ...
src/router/feeRouter.js
... ... @@ -154,5 +154,10 @@ export default [
154 154 name: '/views/fee/printOweFee',
155 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 164 \ No newline at end of file
... ...
src/views/fee/feeConfigManageList.vue
1 1 <template>
2   - <div class="animated fadeInRight">
  2 + <div class="animated fadeInRight padding">
3 3 <el-row :gutter="20">
4 4 <el-col :span="3">
5 5 <div class="border-radius">
... ...
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 29 \ No newline at end of file
... ...
src/views/room/propertyRightRegistrationManageList.vue
... ... @@ -128,7 +128,7 @@
128 128 import { getDict } from '@/api/community/communityApi'
129 129 import { getCommunityId } from '@/api/community/communityApi'
130 130 import { listPropertyRightRegistration } from '@/api/room/propertyRightRegistrationManageApi'
131   -import { queryFloors, queryUnits } from '@/api/room/roomApi'
  131 +import { getFloors, getUnits } from '@/api/room/roomApi'
132 132 import AddPropertyRightRegistration from '@/components/room/addPropertyRightRegistration'
133 133 import ExaminePropertyRightRegistration from '@/components/room/examinePropertyRightRegistration'
134 134 import EditPropertyRightRegistration from '@/components/room/editPropertyRightRegistration'
... ... @@ -221,7 +221,7 @@ export default {
221 221 page: 1,
222 222 row: 50
223 223 }
224   - const data = await queryFloors(params)
  224 + const data = await getFloors(params)
225 225 this.floors = data.apiFloorDataVoList || []
226 226 } catch (error) {
227 227 console.error('获取楼栋数据失败:', error)
... ... @@ -235,7 +235,7 @@ export default {
235 235 page: 1,
236 236 row: 50
237 237 }
238   - const data = await queryUnits(params)
  238 + const data = await getUnits(params)
239 239 this.units = data || []
240 240 this.searchForm.unitId = ''
241 241 } catch (error) {
... ...