feat(finance): refine daily sales statistics

This commit is contained in:
yml2213
2026-08-09 20:43:18 +08:00
parent 211b9f012a
commit 192f7957b8
4 changed files with 24 additions and 82 deletions
@@ -260,7 +260,8 @@ func (r *Repository) dailyItems(ctx context.Context, query DashboardQuery) ([]Fi
pickupProfits := make([]dailyPickupProfitRow, 0) pickupProfits := make([]dailyPickupProfitRow, 0)
if err := db.Table("admin_pickups"). if err := db.Table("admin_pickups").
Select(`DATE(completed_at) AS date, Select(`DATE(completed_at) AS date,
COALESCE(SUM(profit_amount_cent), 0) AS profit_amount_cent`). COALESCE(SUM(profit_amount_cent), 0) AS profit_amount_cent,
COUNT(id) AS completed_count`).
Where("status = ?", "completed"). Where("status = ?", "completed").
Where("completed_at >= ? AND completed_at <= ?", query.StartDate, query.EndDate). Where("completed_at >= ? AND completed_at <= ?", query.StartDate, query.EndDate).
Group("DATE(completed_at)"). Group("DATE(completed_at)").
@@ -318,6 +319,7 @@ func (r *Repository) dailyItems(ctx context.Context, query DashboardQuery) ([]Fi
item.OfflineSettlementPendingAmountCent = row.OfflineSettlementPendingAmountCent item.OfflineSettlementPendingAmountCent = row.OfflineSettlementPendingAmountCent
item.SettlementDiffAmountCent = row.OwnerShouldIncomeAmountCent - row.OwnerEffectiveSettlementAmountCent item.SettlementDiffAmountCent = row.OwnerShouldIncomeAmountCent - row.OwnerEffectiveSettlementAmountCent
item.SettledOrderCount = row.SettledOrderCount item.SettledOrderCount = row.SettledOrderCount
item.SalesCount = row.SettledOrderCount
item.OfflineSettlementPendingCount = row.OfflineSettlementPendingCount item.OfflineSettlementPendingCount = row.OfflineSettlementPendingCount
itemsByDate[date] = item itemsByDate[date] = item
} }
@@ -326,6 +328,8 @@ func (r *Repository) dailyItems(ctx context.Context, query DashboardQuery) ([]Fi
item := itemsByDate[date] item := itemsByDate[date]
item.Date = date item.Date = date
item.PlatformIncomeAmountCent += row.ProfitAmountCent item.PlatformIncomeAmountCent += row.ProfitAmountCent
item.PickupCompletedCount = row.CompletedCount
item.SalesCount += row.CompletedCount
itemsByDate[date] = item itemsByDate[date] = item
} }
for _, row := range estimates { for _, row := range estimates {
@@ -409,6 +413,7 @@ type dailySettlementRow struct {
type dailyPickupProfitRow struct { type dailyPickupProfitRow struct {
Date string Date string
ProfitAmountCent int64 ProfitAmountCent int64
CompletedCount int64
} }
type dailyEstimatedRow struct { type dailyEstimatedRow struct {
@@ -214,6 +214,8 @@ type FinanceDailyDTO struct {
PartialRefundCount int64 `json:"partial_refund_count"` PartialRefundCount int64 `json:"partial_refund_count"`
PendingRefundCount int64 `json:"pending_refund_count"` PendingRefundCount int64 `json:"pending_refund_count"`
SettledOrderCount int64 `json:"settled_order_count"` SettledOrderCount int64 `json:"settled_order_count"`
PickupCompletedCount int64 `json:"pickup_completed_count"`
SalesCount int64 `json:"sales_count"`
OfflineSettlementPendingCount int64 `json:"offline_settlement_pending_count"` OfflineSettlementPendingCount int64 `json:"offline_settlement_pending_count"`
OfflineSettlementPaidAmountCent int64 `json:"offline_settlement_paid_amount_cent"` OfflineSettlementPaidAmountCent int64 `json:"offline_settlement_paid_amount_cent"`
OfflineSettlementPaidCount int64 `json:"offline_settlement_paid_count"` OfflineSettlementPaidCount int64 `json:"offline_settlement_paid_count"`
@@ -51,6 +51,8 @@ export interface FinanceDailyItem {
partial_refund_count: number partial_refund_count: number
pending_refund_count: number pending_refund_count: number
settled_order_count: number settled_order_count: number
pickup_completed_count: number
sales_count: number
offline_settlement_pending_count: number offline_settlement_pending_count: number
offline_settlement_paid_amount_cent: number offline_settlement_paid_amount_cent: number
offline_settlement_paid_count: number offline_settlement_paid_count: number
@@ -6,7 +6,6 @@ import {
fetchFinanceDashboard, fetchFinanceDashboard,
SETTLEMENT_DIFF_THRESHOLD_CENT, SETTLEMENT_DIFF_THRESHOLD_CENT,
type FinanceDashboard, type FinanceDashboard,
type FinanceDailyItem,
} from '@/features/admin/api/adminFinance' } from '@/features/admin/api/adminFinance'
import { formatCentWithSymbol } from '@/shared/utils/money' import { formatCentWithSymbol } from '@/shared/utils/money'
import { formatDateTime, formatInputDate } from '@/shared/utils/time' import { formatDateTime, formatInputDate } from '@/shared/utils/time'
@@ -48,16 +47,6 @@ function defaultEndDate() {
function diffType(value: number) { function diffType(value: number) {
return Math.abs(Number(value || 0)) >= SETTLEMENT_DIFF_THRESHOLD_CENT ? 'danger' : 'success' return Math.abs(Number(value || 0)) >= SETTLEMENT_DIFF_THRESHOLD_CENT ? 'danger' : 'success'
} }
function rowDiffClass(row: FinanceDailyItem) {
return Math.abs(Number(row.settlement_diff_amount_cent || 0)) >= SETTLEMENT_DIFF_THRESHOLD_CENT
? 'amount-danger'
: ''
}
function rowOfflinePendingClass(row: FinanceDailyItem) {
return Number(row.offline_settlement_pending_amount_cent || 0) > 0 ? 'amount-warning' : ''
}
</script> </script>
<template> <template>
@@ -259,73 +248,27 @@ function rowOfflinePendingClass(row: FinanceDailyItem) {
</div> </div>
<el-table v-loading="loading" class="table-panel" :data="dailyItems"> <el-table v-loading="loading" class="table-panel" :data="dailyItems">
<el-table-column prop="date" label="日期" width="130" /> <el-table-column prop="date" label="日期" width="120" />
<el-table-column label="哈夫币结算" width="120">
<template #default="{ row }">{{ row.settled_order_count }}</template>
</el-table-column>
<el-table-column label="线下提号结算" width="140">
<template #default="{ row }">{{ row.pickup_completed_count }}</template>
</el-table-column>
<el-table-column label="销售数量" width="110">
<template #default="{ row }">{{ row.sales_count }}</template>
</el-table-column>
<el-table-column label="平台利润" width="130">
<template #default="{ row }">{{ moneyCent(row.platform_income_amount_cent) }}</template>
</el-table-column>
<el-table-column label="总流水" width="130"> <el-table-column label="总流水" width="130">
<template #default="{ row }">{{ moneyCent(row.total_flow_amount_cent) }}</template> <template #default="{ row }">{{ moneyCent(row.total_flow_amount_cent) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="总退款" width="130"> <el-table-column label="总退款" width="130">
<template #default="{ row }">{{ moneyCent(row.total_refund_amount_cent) }}</template> <template #default="{ row }">{{ moneyCent(row.total_refund_amount_cent) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="渠道净流入" width="140">
<template #default="{ row }">{{ moneyCent(row.channel_net_amount_cent) }}</template>
</el-table-column>
<el-table-column label="平台利润" width="130">
<template #default="{ row }">{{ moneyCent(row.platform_income_amount_cent) }}</template>
</el-table-column>
<el-table-column label="号主应得" width="130">
<template #default="{ row }">{{ moneyCent(row.owner_should_income_amount_cent) }}</template>
</el-table-column>
<el-table-column label="结算金额" width="130">
<template #default="{ row }">{{
moneyCent(row.owner_effective_settlement_amount_cent)
}}</template>
</el-table-column>
<el-table-column label="实际出款" width="130"> <el-table-column label="实际出款" width="130">
<template #default="{ row }"> <template #default="{ row }">{{ moneyCent(row.disbursement_paid_amount_cent) }}</template>
{{ moneyCent(row.disbursement_paid_amount_cent) }}
</template>
</el-table-column>
<el-table-column label="代管打款" width="130">
<template #default="{ row }">
{{ moneyCent(row.offline_settlement_paid_amount_cent) }}
</template>
</el-table-column>
<el-table-column label="提现打款" width="130">
<template #default="{ row }">
{{ moneyCent(row.withdrawal_paid_amount_cent) }}
</template>
</el-table-column>
<el-table-column label="其他线下" width="130">
<template #default="{ row }">
{{ moneyCent(row.manual_paid_amount_cent) }}
</template>
</el-table-column>
<el-table-column label="待线下" width="130">
<template #default="{ row }">
<span :class="rowOfflinePendingClass(row)">
{{ moneyCent(row.offline_settlement_pending_amount_cent) }}
</span>
</template>
</el-table-column>
<el-table-column label="结算差异" width="130">
<template #default="{ row }">
<span :class="rowDiffClass(row)">{{ moneyCent(row.settlement_diff_amount_cent) }}</span>
</template>
</el-table-column>
<el-table-column label="预计收入" width="130">
<template #default="{ row }">{{ moneyCent(row.estimated_income_amount_cent) }}</template>
</el-table-column>
<el-table-column label="销售数量" width="110">
<template #default="{ row }">{{ row.successful_pay_count }}</template>
</el-table-column>
<el-table-column label="全额退款" width="100">
<template #default="{ row }">{{ row.full_refund_count }}</template>
</el-table-column>
<el-table-column label="部分退款" width="100">
<template #default="{ row }">{{ row.partial_refund_count }}</template>
</el-table-column>
<el-table-column label="结算数量" width="110">
<template #default="{ row }">{{ row.settled_order_count }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -336,16 +279,6 @@ function rowOfflinePendingClass(row: FinanceDailyItem) {
</template> </template>
<style scoped> <style scoped>
.amount-danger {
color: #dc2626;
font-weight: 700;
}
.amount-warning {
color: #d97706;
font-weight: 700;
}
.pickup-grid { .pickup-grid {
margin-top: 12px; margin-top: 12px;
} }