feat(finance): 完成成本快照运行层、销售事实与人工支出登记

迁移 108-111:快照业务时间与预估转实际、销售事实表、系统成本项、公司人工支出登记。接单平台按工单实际 reward 入账;人工支出支持登记/审批/驳回/报销并写 actual 快照。新增销售毛利页、人工支出页与订单入口。
This commit is contained in:
yml2213
2026-10-22 16:41:03 +08:00
parent 15989af87c
commit 0889235870
39 changed files with 4824 additions and 143 deletions
+33 -2
View File
@@ -1,5 +1,10 @@
import { apiGet } from '@/lib/http'
import type { AdminFinanceSummary, AdminFinanceTransactionResult } from '@/types/admin/finance'
import { apiGet, apiPost } from '@/lib/http'
import type {
AdminFinanceSummary,
AdminFinanceTransactionResult,
AdminSalesFactsResult,
AdminSalesProfitOverview,
} from '@/types/admin/finance'
export type AdminFinanceDateType = 'occurred' | 'created' | 'reviewed'
@@ -22,3 +27,29 @@ export function fetchAdminFinanceTransactions(
) {
return apiGet<AdminFinanceTransactionResult>('/api/v1/admin/finance/transactions', params)
}
export type AdminSalesProfitParams = {
dateFrom?: string
dateTo?: string
provider?: string
carrierType?: string
page?: number
pageSize?: number
}
export function fetchAdminSalesProfitOverview(params: AdminSalesProfitParams = {}) {
return apiGet<AdminSalesProfitOverview>('/api/v1/admin/finance/sales-profit/overview', params)
}
export function fetchAdminSalesDailyFacts(params: AdminSalesProfitParams = {}) {
return apiGet<AdminSalesFactsResult>('/api/v1/admin/finance/sales-facts', params)
}
export function rebuildAdminSalesDailyFacts(payload: { dateFrom?: string; dateTo?: string }) {
return apiPost<{
range: { fromDate: string; toDate: string }
deletedCount: number
insertedCount: number
computedAt: string
}>('/api/v1/admin/finance/sales-facts/rebuild', payload)
}
@@ -1,6 +1,7 @@
export * from './auth'
export * from './dashboard'
export * from './finance'
export * from './manual-expense'
export * from './cost-center'
export * from './fund'
export * from './users'
@@ -0,0 +1,70 @@
import { apiGet, apiPost } from '@/lib/http'
import type {
AdminManualExpense,
AdminManualExpenseListResult,
AdminManualExpenseOverview,
} from '@/types/admin/manual-expense'
export type AdminManualExpenseParams = {
dateFrom?: string
dateTo?: string
status?: string
keyword?: string
costItemId?: number
paidByAdminUserId?: number
orderId?: number
page?: number
pageSize?: number
}
export function fetchAdminManualExpenses(params: AdminManualExpenseParams = {}) {
return apiGet<AdminManualExpenseListResult>('/api/v1/admin/finance/manual-expenses', params)
}
export function fetchAdminManualExpenseOverview(params: AdminManualExpenseParams = {}) {
return apiGet<AdminManualExpenseOverview>(
'/api/v1/admin/finance/manual-expenses/overview',
params,
)
}
export function fetchAdminManualExpenseCostItems() {
return apiGet<{
items: Array<{
id: number
code: string
name: string
costType: string
carrierType: string
pricingMode: string
}>
}>('/api/v1/admin/finance/manual-expenses/cost-items')
}
export function fetchAdminManualExpense(expenseId: number) {
return apiGet<AdminManualExpense>(`/api/v1/admin/finance/manual-expenses/${expenseId}`)
}
export function createAdminManualExpense(payload: Record<string, unknown>) {
return apiPost<AdminManualExpense>('/api/v1/admin/finance/manual-expenses', payload)
}
export function approveAdminManualExpense(
expenseId: number,
payload: Record<string, unknown> = {},
) {
return apiPost<AdminManualExpense>(
`/api/v1/admin/finance/manual-expenses/${expenseId}/approve`,
payload,
)
}
export function rejectAdminManualExpense(expenseId: number, rejectReason: string) {
return apiPost<AdminManualExpense>(`/api/v1/admin/finance/manual-expenses/${expenseId}/reject`, {
rejectReason,
})
}
export function reimburseAdminManualExpense(expenseId: number) {
return apiPost<AdminManualExpense>(`/api/v1/admin/finance/manual-expenses/${expenseId}/reimburse`)
}