feat(finance): refine daily sales statistics
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user