收费总览

This commit is contained in:
zhouyanli
2026-08-10 14:34:59 +08:00
parent 5b23e48e2c
commit 2440eb7c53
3 changed files with 28 additions and 11 deletions

View File

@@ -16,8 +16,11 @@
</view> </view>
<view class="fee-content"> <view class="fee-content">
<view class="fee-ring"> <view class="fee-ring" v-if="!chartLoading">
<qiun-data-charts type="arcbar" :chartData="arcbarData" :opts="arcbarOpts" /> <qiun-data-charts type="arcbar" :chartData="arcbarData" :opts="arcbarOpts" :animation="false" />
</view>
<view class="fee-ring fee-ring-loading" v-else>
<text class="loading-text">加载中...</text>
</view> </view>
<view class="fee-metrics"> <view class="fee-metrics">
@@ -44,18 +47,19 @@ const props = defineProps({
selectedFeeTypeLabel: { type: String, default: '全部收费类型' }, selectedFeeTypeLabel: { type: String, default: '全部收费类型' },
activeTab: { type: String, default: 'day' }, activeTab: { type: String, default: 'day' },
arcbarPercent: { type: Number, default: 0 }, arcbarPercent: { type: Number, default: 0 },
metricList: { type: Array, default: () => [] } metricList: { type: Array, default: () => [] },
chartLoading: { type: Boolean, default: false }
}) })
const emit = defineEmits(['tab-change', 'fee-type-change']) const emit = defineEmits(['tab-change', 'fee-type-change'])
const arcbarData = computed(() => ({ const arcbarData = computed(() => ({
series: [{ name: '实收占比', data: props.arcbarPercent }] series: [{ name: '实收占比', data: props.arcbarPercent / 100 }]
})) }))
const arcbarOpts = computed(() => ({ const arcbarOpts = computed(() => ({
color: ["#4D5DFA"], color: ["#4D5DFA"],
title: { name: Math.round(props.arcbarPercent * 100) + '%', fontSize: 16, color: '#4D5DFA' }, title: { name: props.arcbarPercent + '%', fontSize: 12, color: '#4D5DFA' },
subtitle: { name: '' }, subtitle: { name: '' },
extra: { extra: {
arcbar: { arcbar: {
@@ -137,6 +141,12 @@ const onFeeTypeChange = (e) => {
height: 180rpx; height: 180rpx;
flex-shrink: 0; flex-shrink: 0;
} }
.fee-ring-loading {
display: flex;
align-items: center;
justify-content: center;
.loading-text { font-size: 24rpx; color: #999; }
}
.fee-metrics { .fee-metrics {
flex: 1; flex: 1;
@@ -159,7 +169,7 @@ const onFeeTypeChange = (e) => {
.metric-compare { .metric-compare {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-end; align-items: flex-start;
.compare-line { font-size: 24rpx; color: #666; line-height: 1.7; } .compare-line { font-size: 24rpx; color: #666; line-height: 1.7; }
.compare-num { font-weight: 600; &.up { color: #67C23A; } &.down { color: #F56C6C; } } .compare-num { font-weight: 600; &.up { color: #67C23A; } &.down { color: #F56C6C; } }
} }

View File

@@ -20,7 +20,7 @@
</view> </view>
</view> </view>
<view class="parking-fee-right"> <view class="parking-fee-right">
<qiun-data-charts type="arcbar" :chartData="parkingArcbarData" :opts="parkingArcbarOpts" /> <qiun-data-charts type="arcbar" :chartData="parkingArcbarData" :opts="parkingArcbarOpts" :animation="false" />
</view> </view>
</view> </view>
</view> </view>
@@ -37,12 +37,12 @@ const props = defineProps({
}) })
const parkingArcbarData = computed(() => ({ const parkingArcbarData = computed(() => ({
series: [{ name: '实收占比', data: props.parkingArcbarPercent }] series: [{ name: '实收占比', data: props.parkingArcbarPercent / 100 }]
})) }))
const parkingArcbarOpts = computed(() => ({ const parkingArcbarOpts = computed(() => ({
color: ["#4D5DFA"], color: ["#4D5DFA"],
title: { name: Math.round(props.parkingArcbarPercent * 100) + '%', fontSize: 16, color: '#4D5DFA' }, title: { name: props.parkingArcbarPercent + '%', fontSize: 12, color: '#4D5DFA' },
subtitle: { name: '' }, subtitle: { name: '' },
extra: { extra: {
arcbar: { arcbar: {

View File

@@ -43,6 +43,7 @@
:active-tab="activeTab" :active-tab="activeTab"
:arcbar-percent="arcbarPercent" :arcbar-percent="arcbarPercent"
:metric-list="metricList" :metric-list="metricList"
:chart-loading="feeLoading"
@tab-change="switchTab" @tab-change="switchTab"
@fee-type-change="onFeeTypeChange" @fee-type-change="onFeeTypeChange"
/> />
@@ -93,6 +94,7 @@ const projectOptions = ref([])
const selectedProject = ref('') const selectedProject = ref('')
const selectedProjectLabel = ref('全部项目') const selectedProjectLabel = ref('全部项目')
const feeLoading = ref(false)
const arcbarPercent = ref(0) const arcbarPercent = ref(0)
const metricList = ref([ const metricList = ref([
@@ -121,6 +123,7 @@ const inspectionList = ref([
const switchTab = (tab) => { const switchTab = (tab) => {
activeTab.value = tab activeTab.value = tab
feeLoading.value = true
fetchFeeSummary() fetchFeeSummary()
} }
@@ -128,6 +131,7 @@ const onProjectChange = (e) => {
const opt = projectOptions.value[e.detail.value] const opt = projectOptions.value[e.detail.value]
selectedProject.value = opt.value selectedProject.value = opt.value
selectedProjectLabel.value = opt.label selectedProjectLabel.value = opt.label
feeLoading.value = true
fetchManagedArea(opt.value) fetchManagedArea(opt.value)
fetchRate(opt.value) fetchRate(opt.value)
fetchFeeSummary() fetchFeeSummary()
@@ -139,6 +143,7 @@ const onProjectChange = (e) => {
const onFeeTypeChange = (opt) => { const onFeeTypeChange = (opt) => {
selectedFeeType.value = opt.value selectedFeeType.value = opt.value
selectedFeeTypeLabel.value = opt.label selectedFeeTypeLabel.value = opt.label
feeLoading.value = true
fetchFeeSummary() fetchFeeSummary()
} }
@@ -177,7 +182,7 @@ const fetchParkingFee = (villageId) => {
parkingCount.value = Number(d.parkingCount) || 0 parkingCount.value = Number(d.parkingCount) || 0
parkingYearReceivable.value = Number(d.receivableAmount) || 0 parkingYearReceivable.value = Number(d.receivableAmount) || 0
parkingYearReceived.value = Number(d.receivedAmount) || 0 parkingYearReceived.value = Number(d.receivedAmount) || 0
parkingArcbarPercent.value = d.receivedPercent != null ? Number(d.receivedPercent) / 100 : 0 parkingArcbarPercent.value = d.receivedPercent
} }
}).catch(() => {}) }).catch(() => {})
} }
@@ -198,7 +203,9 @@ const fetchFeeSummary = () => {
{ label: '欠收总额', value: (Number(d.unpaidAmount) || 0).toFixed(2), yoy: formatRate(d.unpaidYoyRate), mom: formatRate(d.unpaidMomRate) } { label: '欠收总额', value: (Number(d.unpaidAmount) || 0).toFixed(2), yoy: formatRate(d.unpaidYoyRate), mom: formatRate(d.unpaidMomRate) }
] ]
} }
}).catch(() => {}) }).catch(() => {}).finally(() => {
feeLoading.value = false
})
} }
const formatRate = (val) => { const formatRate = (val) => {