From 10d3499d1187318a4b2a02d42ab69d95107f31a8 Mon Sep 17 00:00:00 2001 From: wuxw <928255095@qq.com> Date: Tue, 3 Jun 2025 10:20:32 +0800 Subject: [PATCH] 开发完成 admin 台账功能 --- src/api/fee/adminOweFeeDetailApi.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/api/fee/adminPayFeeDetailApi.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/api/report/communityFeeSummaryApi.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/api/report/operationalAnalysisApi.js | 41 +++++++++++++++++++++++++++++++++++++++++ src/components/fee/SelectAdminCommunity.vue | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/components/fee/communityFloorTree.vue | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/components/report/SelectAdminCommunity.vue | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/i18n/commonLang.js | 6 ++++-- src/i18n/index.js | 12 ++++++++++++ src/router/index.js | 36 ++++++++++++++++++++++++++++-------- src/views/fee/adminOweFeeDetailLang.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/fee/adminOweFeeDetailList.vue | 254 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/fee/adminPayFeeDetailLang.js | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/fee/adminPayFeeDetailList.vue | 431 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/report/communityFeeSummaryLang.js | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/report/communityFeeSummaryList.vue | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/report/operationalAnalysisLang.js | 38 ++++++++++++++++++++++++++++++++++++++ src/views/report/operationalAnalysisList.vue | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 1880 insertions(+), 10 deletions(-) create mode 100644 src/api/fee/adminOweFeeDetailApi.js create mode 100644 src/api/fee/adminPayFeeDetailApi.js create mode 100644 src/api/report/communityFeeSummaryApi.js create mode 100644 src/api/report/operationalAnalysisApi.js create mode 100644 src/components/fee/SelectAdminCommunity.vue create mode 100644 src/components/fee/communityFloorTree.vue create mode 100644 src/components/report/SelectAdminCommunity.vue create mode 100644 src/views/fee/adminOweFeeDetailLang.js create mode 100644 src/views/fee/adminOweFeeDetailList.vue create mode 100644 src/views/fee/adminPayFeeDetailLang.js create mode 100644 src/views/fee/adminPayFeeDetailList.vue create mode 100644 src/views/report/communityFeeSummaryLang.js create mode 100644 src/views/report/communityFeeSummaryList.vue create mode 100644 src/views/report/operationalAnalysisLang.js create mode 100644 src/views/report/operationalAnalysisList.vue diff --git a/src/api/fee/adminOweFeeDetailApi.js b/src/api/fee/adminOweFeeDetailApi.js new file mode 100644 index 0000000..8915e89 --- /dev/null +++ b/src/api/fee/adminOweFeeDetailApi.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询欠费明细 +export function queryAdminOweFeeDetail(params) { + return new Promise((resolve, reject) => { + request({ + url: '/fee.queryAdminOweFeeDetail', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve({ + data: res.data, + total: res.total + }) + } else { + reject(new Error(res.msg || '查询欠费明细失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 查询小区楼层树 +export function queryCommunityFloorTree(params) { + return new Promise((resolve, reject) => { + request({ + url: '/community.queryCommunityFloorTree', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '查询小区楼层树失败')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/fee/adminPayFeeDetailApi.js b/src/api/fee/adminPayFeeDetailApi.js new file mode 100644 index 0000000..76320db --- /dev/null +++ b/src/api/fee/adminPayFeeDetailApi.js @@ -0,0 +1,65 @@ +import request from '@/utils/request' + +// 查询缴费明细列表 +export function queryAdminPayFeeDetail(params) { + return new Promise((resolve, reject) => { + request({ + url: '/fee.queryAdminPayFeeDetail', + method: 'get', + params + }).then(response => { + const res = response.data + console.log(res) + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '查询缴费明细失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 导出缴费明细 +export function exportFeeData(params) { + return new Promise((resolve, reject) => { + request({ + url: '/export.exportData', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '导出缴费明细失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取管理员小区列表 +export function listAdminCommunitys(params) { + return new Promise((resolve, reject) => { + request({ + url: '/community.listAdminCommunitys', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve({ + data: res.data, + total: res.total + }) + } else { + reject(new Error(res.msg || '获取小区列表失败')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/report/communityFeeSummaryApi.js b/src/api/report/communityFeeSummaryApi.js new file mode 100644 index 0000000..3b9db17 --- /dev/null +++ b/src/api/report/communityFeeSummaryApi.js @@ -0,0 +1,64 @@ +import request from '@/utils/request' + +// 获取费用汇总数据 +export function getCommunityFeeSummary(params) { + return new Promise((resolve, reject) => { + request({ + url: '/admin.getCommunityFeeSummary', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '获取费用汇总数据失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取管理员社区列表 +export function listAdminCommunitys(params) { + return new Promise((resolve, reject) => { + request({ + url: '/community.listAdminCommunitys', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '获取管理员社区列表失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 导出数据 +export function exportCommunityFeeSummary(params) { + return new Promise((resolve, reject) => { + request({ + url: '/export.exportData', + method: 'get', + params: { + ...params, + pagePath: 'communityFeeSummary' + } + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '导出费用汇总数据失败')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/report/operationalAnalysisApi.js b/src/api/report/operationalAnalysisApi.js new file mode 100644 index 0000000..a1069a7 --- /dev/null +++ b/src/api/report/operationalAnalysisApi.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +// 获取运营分析数据 +export function getCommunityOperationalAnalysis(params) { + return new Promise((resolve, reject) => { + request({ + url: '/admin.getCommunityOperationalAnalysis', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '获取运营分析数据失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取管理员小区列表 +export function listAdminCommunitys(params) { + return new Promise((resolve, reject) => { + request({ + url: '/community.listAdminCommunitys', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || '获取小区列表失败')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/components/fee/SelectAdminCommunity.vue b/src/components/fee/SelectAdminCommunity.vue new file mode 100644 index 0000000..b47c41c --- /dev/null +++ b/src/components/fee/SelectAdminCommunity.vue @@ -0,0 +1,83 @@ + + + + + + + {{ item.name }} + + + + + + + + + + \ No newline at end of file diff --git a/src/components/fee/communityFloorTree.vue b/src/components/fee/communityFloorTree.vue new file mode 100644 index 0000000..f3dd11b --- /dev/null +++ b/src/components/fee/communityFloorTree.vue @@ -0,0 +1,66 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/components/report/SelectAdminCommunity.vue b/src/components/report/SelectAdminCommunity.vue new file mode 100644 index 0000000..92b44af --- /dev/null +++ b/src/components/report/SelectAdminCommunity.vue @@ -0,0 +1,106 @@ + + + + + + + {{ item.name }} + + + + + + + + + + \ No newline at end of file diff --git a/src/i18n/commonLang.js b/src/i18n/commonLang.js index cd5dc6b..50ea879 100644 --- a/src/i18n/commonLang.js +++ b/src/i18n/commonLang.js @@ -31,7 +31,8 @@ export const messages = { female: 'Female', male: 'Male', all: 'All', - refresh: 'Refresh' + refresh: 'Refresh', + export: 'Export' } }, zh: { @@ -66,7 +67,8 @@ export const messages = { female: '女', male: '男', all: '全部', - refresh: '刷新' + refresh: '刷新', + export: '导出' } } } \ No newline at end of file diff --git a/src/i18n/index.js b/src/i18n/index.js index 2ed6ac6..522bcf9 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -84,6 +84,10 @@ import { messages as adminInoutMessages } from '../views/iot/adminInoutLang' import { messages as adminCarInoutMessages } from '../views/iot/adminCarInoutLang' import { messages as adminChargeOrderMessages } from '../views/iot/adminChargeOrderLang' import { messages as adminMeterRechargeMessages } from '../views/iot/adminMeterRechargeLang' +import { messages as operationalAnalysisMessages } from '../views/report/operationalAnalysisLang' +import { messages as communityFeeSummaryMessages } from '../views/report/communityFeeSummaryLang' +import { messages as adminPayFeeDetailMessages } from '../views/fee/adminPayFeeDetailLang' +import { messages as adminOweFeeDetailMessages } from '../views/fee/adminOweFeeDetailLang' Vue.use(VueI18n) @@ -172,6 +176,10 @@ const messages = { ...adminCarInoutMessages.en, ...adminChargeOrderMessages.en, ...adminMeterRechargeMessages.en, + ...operationalAnalysisMessages.en, + ...communityFeeSummaryMessages.en, + ...adminPayFeeDetailMessages.en, + ...adminOweFeeDetailMessages.en, }, zh: { ...loginMessages.zh, @@ -256,6 +264,10 @@ const messages = { ...adminCarInoutMessages.zh, ...adminChargeOrderMessages.zh, ...adminMeterRechargeMessages.zh, + ...operationalAnalysisMessages.zh, + ...communityFeeSummaryMessages.zh, + ...adminPayFeeDetailMessages.zh, + ...adminOweFeeDetailMessages.zh, } } diff --git a/src/router/index.js b/src/router/index.js index a6ba365..845b309 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -397,15 +397,35 @@ const routes = [ component: () => import('@/views/iot/adminCarInoutList.vue') }, { - path:'/pages/iot/adminChargeOrder', - name:'/pages/iot/adminChargeOrder', + path: '/pages/iot/adminChargeOrder', + name: '/pages/iot/adminChargeOrder', component: () => import('@/views/iot/adminChargeOrderList.vue') - }, - { - path:'/pages/iot/adminMeterRecharge', - name:'/pages/iot/adminMeterRecharge', - component: () => import('@/views/iot/adminMeterRechargeList.vue') - }, + }, + { + path: '/pages/iot/adminMeterRecharge', + name: '/pages/iot/adminMeterRecharge', + component: () => import('@/views/iot/adminMeterRechargeList.vue') + }, + { + path: '/pages/report/operationalAnalysis', + name: '/pages/report/operationalAnalysis', + component: () => import('@/views/report/operationalAnalysisList.vue') + }, + { + path: '/pages/report/communityFeeSummary', + name: '/pages/report/communityFeeSummary', + component: () => import('@/views/report/communityFeeSummaryList.vue') + }, + { + path: '/pages/fee/adminPayFeeDetail', + name: '/pages/fee/adminPayFeeDetail', + component: () => import('@/views/fee/adminPayFeeDetailList.vue') + }, + { + path: '/pages/fee/adminOweFeeDetail', + name: '/pages/fee/adminOweFeeDetail', + component: () => import('@/views/fee/adminOweFeeDetailList.vue') + }, // 其他子路由可以在这里添加 ] }, diff --git a/src/views/fee/adminOweFeeDetailLang.js b/src/views/fee/adminOweFeeDetailLang.js new file mode 100644 index 0000000..63b6ec8 --- /dev/null +++ b/src/views/fee/adminOweFeeDetailLang.js @@ -0,0 +1,92 @@ +export const messages = { + en: { + adminOweFeeDetail: { + search: { + title: 'Search Conditions', + feeTypeCd: 'Please select fee type', + objNameLike: 'Please enter room number', + startTime: 'Please select start time', + endTime: 'Please select end time', + ownerNameLike: 'Please enter owner name' + }, + list: { + title: 'Arrears Details' + }, + table: { + index: 'No.', + communityName: 'Community Name', + objName: 'Room Number', + ownerName: 'Owner', + ownerTel: 'Owner Tel', + builtUpArea: 'Area', + feeName: 'Fee Item', + startTime: 'Start Time', + endTime: 'End Time', + oweDay: 'Arrears Days', + oweAmount: 'Arrears Amount' + }, + summary: { + subtotal: 'Subtotal', + total: 'Total', + owe: 'Arrears', + yuan: 'Yuan' + }, + tips: { + startTime: 'Start time: the billing start time of the created fee', + oweDayDeposit: 'Arrears days (days): The arrears days of the deposit fee item is the number of days from the start time of the fee to the current day', + oweDayOther: 'For fee items other than deposits, the arrears days are the number of days from the start time to the end time of the fee', + oweAmount: 'Arrears amount: the fee payable during the arrears period' + }, + feeType: { + property: 'Property Fee', + parking: 'Parking Fee' + }, + fetchError: 'Failed to fetch arrears details' + } + }, + zh: { + adminOweFeeDetail: { + search: { + title: '查询条件', + feeTypeCd: '请选择费用大类', + objNameLike: '请填写房屋编号', + startTime: '请选择开始时间', + endTime: '请选择结束时间', + ownerNameLike: '请填写业主名称' + }, + list: { + title: '欠费明细表' + }, + table: { + index: '费用编号', + communityName: '小区名称', + objName: '房号', + ownerName: '业主', + ownerTel: '业主电话', + builtUpArea: '面积', + feeName: '费用项', + startTime: '开始时间', + endTime: '结束时间', + oweDay: '欠费时长(天)', + oweAmount: '欠费金额' + }, + summary: { + subtotal: '小计', + total: '大计', + owe: '欠费', + yuan: '元' + }, + tips: { + startTime: '费用开始时间:所创建费用的计费起始时间', + oweDayDeposit: '欠费时长(天):押金费用项欠费时长是费用开始时间到当天的天数', + oweDayOther: '除押金外的费用项欠费时长是费用的开始时间到费用的结束时间的天数', + oweAmount: '欠费金额:欠费周期内应缴费用' + }, + feeType: { + property: '物业费', + parking: '停车费' + }, + fetchError: '获取欠费明细失败' + } + } +} \ No newline at end of file diff --git a/src/views/fee/adminOweFeeDetailList.vue b/src/views/fee/adminOweFeeDetailList.vue new file mode 100644 index 0000000..b3785b9 --- /dev/null +++ b/src/views/fee/adminOweFeeDetailList.vue @@ -0,0 +1,254 @@ + + + + + + + + + + {{ $t('adminOweFeeDetail.search.title') }} + + + + + + + + + + + + + + + + + + + + + + {{ $t('common.search') }} + + + {{ $t('common.reset') }} + + + + + + + + {{ $t('adminOweFeeDetail.list.title') }} + + + + + + + + + + + + + + + + + + + {{ $t('adminOweFeeDetail.summary.subtotal') }} + + {{ $t('adminOweFeeDetail.summary.owe') }}: {{ totalPreferentialAmount }} + {{ $t('adminOweFeeDetail.summary.yuan') }} + + + + {{ $t('adminOweFeeDetail.summary.total') }} + + {{ $t('adminOweFeeDetail.summary.owe') }}: {{ allOweAmount }} + {{ $t('adminOweFeeDetail.summary.yuan') }} + + + + + + + + {{ $t('adminOweFeeDetail.tips.startTime') }} + {{ $t('adminOweFeeDetail.tips.oweDayDeposit') }} + {{ $t('adminOweFeeDetail.tips.oweDayOther') }} + {{ $t('adminOweFeeDetail.tips.oweAmount') }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/fee/adminPayFeeDetailLang.js b/src/views/fee/adminPayFeeDetailLang.js new file mode 100644 index 0000000..07f453a --- /dev/null +++ b/src/views/fee/adminPayFeeDetailLang.js @@ -0,0 +1,134 @@ +export const messages = { + en: { + adminPayFeeDetail: { + search: { + title: 'Search Conditions', + startTime: 'Payment Start Time', + startTimePlaceholder: 'Please select payment start time', + endTime: 'Payment End Time', + endTimePlaceholder: 'Please select payment end time', + paymentMethod: 'Payment Method', + paymentMethodPlaceholder: 'Please select payment method', + feeStatus: 'Fee Status', + feeStatusPlaceholder: 'Please select fee status', + feeType: 'Fee Type', + feeTypePlaceholder: 'Please select fee type', + feeStartTime: 'Fee Start Time', + feeStartTimePlaceholder: 'Please select fee start time', + feeEndTime: 'Fee End Time', + feeEndTimePlaceholder: 'Please select fee end time', + payerObjName: 'Room/Car Number', + payerObjNamePlaceholder: 'Room number or license plate number' + }, + list: { + title: 'Payment Records', + tooltip: 'All room payment record details' + }, + table: { + orderId: 'Order No', + payerInfo: 'Room/Owner', + feeInfo: 'Fee Type>Fee Item', + feeStatus: 'Fee Status', + paymentMethod: 'Payment Method', + feePeriod: 'Payment Period', + paymentTime: 'Payment Time', + cashier: 'Cashier', + payableAmount: 'Payable/Receivable Amount(Yuan)', + receivedAmount: 'Received Amount(Yuan)', + withholdAmount: 'Account Deduction(Yuan)', + discountAmount: 'Discount/Deduction Amount(Yuan)', + giftAmount: 'Gift Amount(Yuan)', + lateFee: 'Late Fee(Yuan)', + area: 'Area(sqm)', + parkingSpace: 'Parking Space', + remark: 'Remark' + }, + summary: { + subtotal: 'Subtotal', + total: 'Total', + receivable: 'Receivable', + received: 'Received', + discount: 'Discount', + deduction: 'Deduction', + gift: 'Gift', + lateFee: 'Late Fee', + yuan: 'Yuan', + discountDesc: 'Discount amount: discount amount generated under discount rules and no arrears discount rules', + deductionDesc: 'Deduction amount: deduction amount generated under deduction rules', + giftDesc: 'Gift amount: payable amount of gift months under gift rules', + lateFeeDesc: 'Late fee: default late fee generated under default late fee rules, additional late fee to be paid' + }, + allCommunities: 'All Communities', + fetchError: 'Failed to fetch payment details', + fetchCommunityError: 'Failed to fetch community list', + exportSuccess: 'Export started successfully', + exportError: 'Failed to export data' + } + }, + zh: { + adminPayFeeDetail: { + search: { + title: '查询条件', + startTime: '缴费开始时间', + startTimePlaceholder: '请选择缴费开始时间', + endTime: '缴费结束时间', + endTimePlaceholder: '请选择缴费结束时间', + paymentMethod: '支付方式', + paymentMethodPlaceholder: '请选择支付方式', + feeStatus: '费用状态', + feeStatusPlaceholder: '请选择费用状态', + feeType: '费用类型', + feeTypePlaceholder: '请选择费用类型', + feeStartTime: '收费开始时间', + feeStartTimePlaceholder: '请选择收费开始时间', + feeEndTime: '收费结束时间', + feeEndTimePlaceholder: '请选择收费结束时间', + payerObjName: '房屋/车牌号', + payerObjNamePlaceholder: '房屋编号或者车牌号' + }, + list: { + title: '缴费记录', + tooltip: '所有房屋缴费记录明细' + }, + table: { + orderId: '订单号', + payerInfo: '房号/业主', + feeInfo: '费用类型>费用项', + feeStatus: '费用状态', + paymentMethod: '支付方式', + feePeriod: '缴费时间段', + paymentTime: '缴费时间', + cashier: '收银员', + payableAmount: '应缴/应收金额(元)', + receivedAmount: '实收金额(元)', + withholdAmount: '账户抵扣(元)', + discountAmount: '优惠/减免金额(元)', + giftAmount: '赠送金额(元)', + lateFee: '滞纳金(元)', + area: '面积(平方米)', + parkingSpace: '车位', + remark: '说明' + }, + summary: { + subtotal: '小计', + total: '大计', + receivable: '应收', + received: '实收', + discount: '优惠', + deduction: '减免', + gift: '赠送', + lateFee: '滞纳金', + yuan: '元', + discountDesc: '优惠金额:打折规则和打折无欠费规则下产生的优惠金额', + deductionDesc: '减免金额:减免规则下产生的减免金额', + giftDesc: '赠送金额:赠送规则下赠送月份应缴的金额', + lateFeeDesc: '滞纳金:违约滞纳金规则下产生的违约金额,需额外缴纳的滞纳金' + }, + allCommunities: '全部小区', + fetchError: '获取缴费明细失败', + fetchCommunityError: '获取小区列表失败', + exportSuccess: '导出成功', + exportError: '导出失败' + } + } +} \ No newline at end of file diff --git a/src/views/fee/adminPayFeeDetailList.vue b/src/views/fee/adminPayFeeDetailList.vue new file mode 100644 index 0000000..3df98bc --- /dev/null +++ b/src/views/fee/adminPayFeeDetailList.vue @@ -0,0 +1,431 @@ + + + + + + + + + + {{ $t('adminPayFeeDetail.search.title') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('common.search') }} + {{ $t('common.reset') }} + + + + + + + + {{ $t('adminPayFeeDetail.list.title') }} + + + + + + {{ $t('common.export') }} + + + + + + + + {{ scope.row.payerObjName }}/{{ scope.row.ownerName }} + {{ scope.row.communityName }} + + + + + {{ scope.row.feeTypeCdName }}>{{ scope.row.feeName }} + + + + + + + {{ formatDate(scope.row.startTime) }} + ~ + {{ formatDate(scope.row.endTime) }} + + + + + + + {{ scope.row.payableAmount }}/{{ scope.row.receivableAmount }} + + + + + + + {{ scope.row.preferentialAmount }}/{{ scope.row.deductionAmount }} + + + + + + + + + + + + + {{ $t('adminPayFeeDetail.summary.subtotal') }} + {{ $t('adminPayFeeDetail.summary.total') }} + + + + {{ $t('adminPayFeeDetail.summary.receivable') }}: {{ summary.totalReceivableAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.receivable') }}: {{ summary.allReceivableAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + {{ $t('adminPayFeeDetail.summary.received') }}: {{ summary.totalReceivedAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.received') }}: {{ summary.allReceivedAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + {{ $t('adminPayFeeDetail.summary.discount') }}: {{ summary.totalPreferentialAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.discount') }}: {{ summary.allPreferentialAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + {{ $t('adminPayFeeDetail.summary.deduction') }}: {{ summary.totalDeductionAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.deduction') }}: {{ summary.allDeductionAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + {{ $t('adminPayFeeDetail.summary.gift') }}: {{ summary.totalGiftAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.gift') }}: {{ summary.allGiftAmount }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + {{ $t('adminPayFeeDetail.summary.lateFee') }}: {{ summary.totalLateFee }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + {{ $t('adminPayFeeDetail.summary.lateFee') }}: {{ summary.allLateFee }} + {{ $t('adminPayFeeDetail.summary.yuan') }} + + + + + + + + + {{ $t('adminPayFeeDetail.summary.discountDesc') }} + {{ $t('adminPayFeeDetail.summary.deductionDesc') }} + {{ $t('adminPayFeeDetail.summary.giftDesc') }} + {{ $t('adminPayFeeDetail.summary.lateFeeDesc') }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/report/communityFeeSummaryLang.js b/src/views/report/communityFeeSummaryLang.js new file mode 100644 index 0000000..7ebf060 --- /dev/null +++ b/src/views/report/communityFeeSummaryLang.js @@ -0,0 +1,72 @@ +export const messages = { + en: { + communityFeeSummary: { + search: { + title: 'Search Conditions', + startDate: 'Start Date', + endDate: 'End Date', + feeType: 'Fee Type', + selectFeeType: 'Please select fee type', + allCommunities: 'All Communities' + }, + table: { + title: 'Fee Summary Report', + tooltip: 'Summarize fee information by month', + updateDaily: 'Updated daily', + totalRooms: 'Total Rooms', + feeRooms: 'Fee Rooms', + oweRooms: 'Owe Rooms', + oweFeeFormula: 'History Owe + Current Owe = Total Owe', + hisOweFee: 'History Owe', + curOweFee: 'Current Owe', + totalOweFee: 'Total Owe', + receivedFeeFormula: 'Owe Recovery + Current Partial + Prepayment = Actual Payment', + hisReceivedFee: 'Owe Recovery', + curPartialFee: 'Current Partial', + preReceivedFee: 'Prepayment', + totalReceivedFee: 'Actual Payment', + curReceivableFee: 'Current Receivable', + curReceivedFee: 'Current Received', + roomFeeRate: 'Paid Rooms/Fee Rooms = Room Fee Rate', + feeRate: 'Current Received/Current Receivable = Fee Rate', + clearRate: 'Owe Recovery/(Owe Recovery + History Owe) = Clear Rate' + }, + fetchError: 'Failed to fetch fee summary data' + } + }, + zh: { + communityFeeSummary: { + search: { + title: '查询条件', + startDate: '开始时间', + endDate: '结束时间', + feeType: '费用大类', + selectFeeType: '请选择费用大类', + allCommunities: '全部小区' + }, + table: { + title: '费用汇总表', + tooltip: '以月份为维度,进行费用情况汇总', + updateDaily: '按天更新', + totalRooms: '总户数', + feeRooms: '收费户', + oweRooms: '欠费户', + oweFeeFormula: '历史欠费+当期欠费=欠费', + hisOweFee: '历史欠费', + curOweFee: '当期欠费', + totalOweFee: '总欠费', + receivedFeeFormula: '欠费追回+当期部分+预交=实缴', + hisReceivedFee: '欠费追回', + curPartialFee: '当期部分', + preReceivedFee: '预交', + totalReceivedFee: '实缴', + curReceivableFee: '当期应收', + curReceivedFee: '当期实收', + roomFeeRate: '已交户/收费户=户收费率', + feeRate: '当期实收/当期应收=收费率', + clearRate: '欠费追回/(欠费追回+历史欠费)=清缴率' + }, + fetchError: '获取费用汇总数据失败' + } + } +} \ No newline at end of file diff --git a/src/views/report/communityFeeSummaryList.vue b/src/views/report/communityFeeSummaryList.vue new file mode 100644 index 0000000..b78f9b7 --- /dev/null +++ b/src/views/report/communityFeeSummaryList.vue @@ -0,0 +1,202 @@ + + + + + + + + + + {{ $t('communityFeeSummary.search.title') }} + + + + + + + + + + + + + + + + + {{ $t('common.search') }} + + + + + + + + {{ $t('communityFeeSummary.table.title') }} + + + + ({{ $t('communityFeeSummary.table.updateDaily') }}) + + + + + + + + + + + {{ (scope.row.curOweFee + scope.row.hisOweFee).toFixed(2) }} + + + + + + + + {{ (scope.row.receivedFee - scope.row.hisReceivedFee - scope.row.preReceivedFee).toFixed(2) }} + + + + + + + + + {{ (scope.row.curReceivableFee - scope.row.curOweFee).toFixed(2) }} + + + + + {{ scope.row.feeRoomCount > 0 ? + (((scope.row.feeRoomCount - scope.row.oweRoomCount) / scope.row.feeRoomCount * 100).toFixed(2) + '%') : + '0%' }} + + + + + {{ scope.row.curReceivableFee > 0 ? + (((scope.row.curReceivableFee - scope.row.curOweFee) / scope.row.curReceivableFee * 100).toFixed(2) + '%'): '0%' }} + + + + + {{ (scope.row.hisReceivedFee + scope.row.hisOweFee) > 0 ? + ((scope.row.hisReceivedFee / (scope.row.hisReceivedFee + scope.row.hisOweFee) * 100).toFixed(2) + '%') : + '0%' }} + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/report/operationalAnalysisLang.js b/src/views/report/operationalAnalysisLang.js new file mode 100644 index 0000000..69bc20b --- /dev/null +++ b/src/views/report/operationalAnalysisLang.js @@ -0,0 +1,38 @@ +export const messages = { + en: { + operationalAnalysis: { + allCommunities: 'All Communities', + fetchError: 'Failed to fetch operational analysis data', + fetchCommunityError: 'Failed to fetch community list', + chart: { + payFee: 'Payment Orders', + repair: 'Repair Orders', + inspection: 'Inspections', + maintainance: 'Maintenance', + itemIn: 'Purchase Orders', + itemOut: 'Withdrawal Orders', + carIn: 'Vehicle Entries', + personIn: 'Door Openings', + contract: 'Contracts' + } + } + }, + zh: { + operationalAnalysis: { + allCommunities: '全部小区', + fetchError: '获取运营分析数据失败', + fetchCommunityError: '获取小区列表失败', + chart: { + payFee: '缴费订单数', + repair: '报修订单数', + inspection: '巡检数', + maintainance: '保养数', + itemIn: '采购订单数', + itemOut: '领用订单数', + carIn: '车辆进场数', + personIn: '开门记录', + contract: '签订合同数' + } + } + } +} \ No newline at end of file diff --git a/src/views/report/operationalAnalysisList.vue b/src/views/report/operationalAnalysisList.vue new file mode 100644 index 0000000..7b84729 --- /dev/null +++ b/src/views/report/operationalAnalysisList.vue @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- libgit2 0.21.4