From 88eae83dbeeb3cf50d81fff62fd346cf9247e5cf Mon Sep 17 00:00:00 2001 From: zhx Date: Fri, 3 Jul 2026 13:08:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/admin-openapi.json | 97 +++++++++++++ finance/src/FinanceApp.jsx | 82 ++++++++++- finance/src/api.js | 54 ++++++- .../components/FinanceRechargeDetailList.jsx | 137 ++++++++++++++++-- finance/src/format.js | 70 +++++++++ finance/src/styles/index.css | 34 ++++- src/shared/api/generated/endpoints.ts | 24 +++ src/shared/api/generated/schema.d.ts | 97 +++++++++++++ 8 files changed, 573 insertions(+), 22 deletions(-) diff --git a/contracts/admin-openapi.json b/contracts/admin-openapi.json index 7b46e15..fffcf0b 100644 --- a/contracts/admin-openapi.json +++ b/contracts/admin-openapi.json @@ -2825,6 +2825,103 @@ "x-permissions": ["payment-bill:view"] } }, + "/admin/payment/recharge-bills/summary": { + "get": { + "operationId": "getRechargeBillSummary", + "parameters": [ + { + "in": "query", + "name": "keyword", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "recharge_type", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "status", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "region_id", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "start_at_ms", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "end_at_ms", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-bill:view", + "x-permissions": ["payment-bill:view"] + } + }, + "/admin/payment/recharge-bills/google-paid/refresh": { + "post": { + "operationId": "refreshGoogleRechargePaid", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "transactionIds": { + "type": "array", + "items": { "type": "string" } + } + }, + "required": ["transactionIds"] + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-bill:view", + "x-permissions": ["payment-bill:view"] + } + }, + "/admin/payment/recharge-regions": { + "get": { + "operationId": "listRechargeRegions", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-bill:view", + "x-permissions": ["payment-bill:view"] + } + }, "/admin/payment/recharge-products": { "get": { "operationId": "listRechargeProducts", diff --git a/finance/src/FinanceApp.jsx b/finance/src/FinanceApp.jsx index 67978c6..d5faf90 100644 --- a/finance/src/FinanceApp.jsx +++ b/finance/src/FinanceApp.jsx @@ -7,12 +7,15 @@ import { approveFinanceWithdrawalApplication, createFinanceApplication, fetchFinanceApplicationOptions, + fetchFinanceRechargeSummary, fetchFinanceSession, filterOperationsByPermissions, listFinanceApplications, listFinanceRechargeDetails, + listFinanceRechargeRegions, listMyFinanceApplications, listFinanceWithdrawalApplications, + refreshFinanceGoogleRechargePaid, rejectFinanceApplication, rejectFinanceWithdrawalApplication } from "./api.js"; @@ -24,7 +27,7 @@ import { FinanceRechargeDetailList } from "./components/FinanceRechargeDetailLis import { FinanceShell } from "./components/FinanceShell.jsx"; import { FinanceWithdrawalApplicationList } from "./components/FinanceWithdrawalApplicationList.jsx"; import { DEFAULT_APPLICATION_FORM } from "./constants.js"; -import { buildApplicationPayload, validateApplicationPayload } from "./format.js"; +import { EMPTY_RECHARGE_SUMMARY, buildApplicationPayload, validateApplicationPayload } from "./format.js"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; const emptyOptions = { apps: [], operations: [], walletIdentities: [] }; @@ -35,11 +38,14 @@ export function FinanceApp() { const [sessionState, setSessionState] = useState({ error: "", loading: true, session: null }); const [optionsState, setOptionsState] = useState({ data: emptyOptions, error: "", loading: false }); const [rechargeDetailsState, setRechargeDetailsState] = useState({ data: { items: [], page: 1, pageSize, total: 0 }, error: "", loading: false }); + const [rechargeSummaryState, setRechargeSummaryState] = useState({ data: EMPTY_RECHARGE_SUMMARY, error: "", loading: false }); + const [rechargeRegionsState, setRechargeRegionsState] = useState({ appCode: "", items: [], loading: false }); + const [googlePaidRefreshing, setGooglePaidRefreshing] = useState(false); const [myApplicationsState, setMyApplicationsState] = useState({ data: { items: [], page: 1, pageSize, total: 0 }, error: "", loading: false }); const [applicationsState, setApplicationsState] = useState({ data: { items: [], page: 1, pageSize, total: 0 }, error: "", loading: false }); const [withdrawalsState, setWithdrawalsState] = useState({ data: { items: [], page: 1, pageSize, total: 0 }, error: "", loading: false }); const [activeView, setActiveView] = useState("create"); - const [rechargeDetailFilters, setRechargeDetailFilters] = useState({ appCode: "", keyword: "", page: 1, timeRange: { endMs: "", startMs: "" } }); + const [rechargeDetailFilters, setRechargeDetailFilters] = useState({ appCode: "", keyword: "", page: 1, regionId: "", timeRange: { endMs: "", startMs: "" } }); const [myFilters, setMyFilters] = useState({ appCode: "", keyword: "", operation: "", page: 1, status: "" }); const [filters, setFilters] = useState({ appCode: "", keyword: "", operation: "", page: 1, status: "pending" }); const [withdrawalFilters, setWithdrawalFilters] = useState({ appCode: "", keyword: "", page: 1 }); @@ -88,6 +94,7 @@ export function FinanceApp() { keyword: rechargeDetailFilters.keyword, page: rechargeDetailFilters.page, page_size: pageSize, + region_id: rechargeDetailFilters.appCode ? rechargeDetailFilters.regionId : "", start_at_ms: rechargeDetailFilters.timeRange.startMs, stat_tz: "Asia/Shanghai", status: "succeeded" @@ -165,6 +172,58 @@ export function FinanceApp() { } }, [optionsState.data.apps, rechargeDetailQuery, session?.canViewAppRechargeDetails]); + const loadRechargeSummary = useCallback(async () => { + if (!session?.canViewAppRechargeDetails) { + return; + } + setRechargeSummaryState((current) => ({ ...current, error: "", loading: true })); + try { + const data = await fetchFinanceRechargeSummary(rechargeDetailQuery, optionsState.data.apps); + setRechargeSummaryState({ data, error: "", loading: false }); + } catch (err) { + setRechargeSummaryState((current) => ({ ...current, error: err.message || "加载充值汇总失败", loading: false })); + } + }, [optionsState.data.apps, rechargeDetailQuery, session?.canViewAppRechargeDetails]); + + const rechargeAppCode = rechargeDetailFilters.appCode; + const loadRechargeRegions = useCallback(async () => { + if (!session?.canViewAppRechargeDetails || !rechargeAppCode) { + setRechargeRegionsState({ appCode: "", items: [], loading: false }); + return; + } + setRechargeRegionsState((current) => ({ ...current, appCode: rechargeAppCode, loading: true })); + try { + const items = await listFinanceRechargeRegions(rechargeAppCode); + setRechargeRegionsState({ appCode: rechargeAppCode, items, loading: false }); + } catch { + setRechargeRegionsState({ appCode: rechargeAppCode, items: [], loading: false }); + } + }, [rechargeAppCode, session?.canViewAppRechargeDetails]); + + const refreshGooglePaid = useCallback( + async (transactionIds) => { + if (!rechargeAppCode || !transactionIds?.length || googlePaidRefreshing) { + return; + } + setGooglePaidRefreshing(true); + try { + const results = await refreshFinanceGoogleRechargePaid(rechargeAppCode, transactionIds); + const failed = results.filter((item) => item.error).length; + const succeeded = results.length - failed; + showToast( + failed ? `谷歌实付同步完成:成功 ${succeeded} 笔,失败 ${failed} 笔` : `谷歌实付同步完成:${succeeded} 笔`, + failed ? "warning" : "success" + ); + await loadRechargeDetails(); + } catch (err) { + showToast(err.message || "查询谷歌实付失败", "error"); + } finally { + setGooglePaidRefreshing(false); + } + }, + [googlePaidRefreshing, loadRechargeDetails, rechargeAppCode, showToast] + ); + const loadApplications = useCallback(async () => { if (!session?.canAuditApplication) { return; @@ -203,6 +262,14 @@ export function FinanceApp() { loadRechargeDetails(); }, [loadRechargeDetails]); + useEffect(() => { + loadRechargeSummary(); + }, [loadRechargeSummary]); + + useEffect(() => { + loadRechargeRegions(); + }, [loadRechargeRegions]); + useEffect(() => { loadApplications(); }, [loadApplications]); @@ -330,6 +397,7 @@ export function FinanceApp() { onRefresh={() => { loadOptions(); loadRechargeDetails(); + loadRechargeSummary(); loadMyApplications(); loadApplications(); loadWithdrawals(); @@ -341,10 +409,18 @@ export function FinanceApp() { bills={rechargeDetailsState.data} error={rechargeDetailsState.error} filters={rechargeDetailFilters} + googlePaidRefreshing={googlePaidRefreshing} loading={rechargeDetailsState.loading} options={optionsState.data} + regions={rechargeRegionsState.items} + summary={rechargeSummaryState.data} + summaryLoading={rechargeSummaryState.loading} onFiltersChange={updateRechargeDetailFilters} - onReload={loadRechargeDetails} + onRefreshGooglePaid={refreshGooglePaid} + onReload={() => { + loadRechargeDetails(); + loadRechargeSummary(); + }} /> ) : activeView === "applications" && session.canAuditApplication ? ( app.appCode); + if (!appCodes.length) { + return mergeRechargeSummaries([]); + } + const summaries = await Promise.all(appCodes.map((appCode) => getRechargeSummaryForApp(appCode, cleanQuery))); + return mergeRechargeSummaries(summaries); +} + +export async function listFinanceRechargeRegions(appCode) { + const endpoint = API_ENDPOINTS.listRechargeRegions; + const data = await apiRequest(apiEndpointPath(API_OPERATIONS.listRechargeRegions), { + headers: { [appCodeHeader]: appCode }, + method: endpoint.method + }); + return normalizeRechargeRegions(data); +} + +export async function refreshFinanceGoogleRechargePaid(appCode, transactionIds) { + const endpoint = API_ENDPOINTS.refreshGoogleRechargePaid; + const data = await apiRequest(apiEndpointPath(API_OPERATIONS.refreshGoogleRechargePaid), { + body: { transactionIds }, + headers: { [appCodeHeader]: appCode }, + method: endpoint.method + }); + return Array.isArray(data?.items) ? data.items : []; +} + export async function createFinanceApplication(payload) { const endpoint = API_ENDPOINTS.createFinanceApplication; return apiRequest(apiEndpointPath(API_OPERATIONS.createFinanceApplication), { @@ -152,6 +194,16 @@ async function currentSession() { } } +async function getRechargeSummaryForApp(appCode, query = {}) { + const endpoint = API_ENDPOINTS.getRechargeBillSummary; + const data = await apiRequest(apiEndpointPath(API_OPERATIONS.getRechargeBillSummary), { + headers: { [appCodeHeader]: appCode }, + method: endpoint.method, + query + }); + return normalizeRechargeSummary(data); +} + async function listRechargeBillsForApp(appCode, query = {}) { const endpoint = API_ENDPOINTS.listRechargeBills; const data = await apiRequest(apiEndpointPath(API_OPERATIONS.listRechargeBills), { diff --git a/finance/src/components/FinanceRechargeDetailList.jsx b/finance/src/components/FinanceRechargeDetailList.jsx index 7f1de4b..a12ea7a 100644 --- a/finance/src/components/FinanceRechargeDetailList.jsx +++ b/finance/src/components/FinanceRechargeDetailList.jsx @@ -1,3 +1,4 @@ +import CloudSyncOutlined from "@mui/icons-material/CloudSyncOutlined"; import RefreshOutlined from "@mui/icons-material/RefreshOutlined"; import Button from "@mui/material/Button"; import MenuItem from "@mui/material/MenuItem"; @@ -10,29 +11,48 @@ import TableRow from "@mui/material/TableRow"; import TextField from "@mui/material/TextField"; import { TimeRangeFilter } from "@/shared/ui/TimeRangeFilter.jsx"; import { + EMPTY_RECHARGE_SUMMARY, formatAmount, formatMicroMoney, formatTime, formatUsdMinor, - formatPercent, rechargeTypeLabel, } from "../format.js"; -export function FinanceRechargeDetailList({ bills, error, filters, loading, onFiltersChange, onReload, options }) { +export function FinanceRechargeDetailList({ + bills, + error, + filters, + googlePaidRefreshing, + loading, + onFiltersChange, + onRefreshGooglePaid, + onReload, + options, + regions, + summary, + summaryLoading, +}) { const items = bills.items || []; const page = Number(bills.page || filters.page || 1); const pageSize = Number(bills.pageSize || 50); const total = Number(bills.total || 0); const hasNextPage = page * pageSize < total; + const regionOptions = regions || []; + const pendingGoogleTxIds = items + .filter((item) => item.rechargeType === "google_play_recharge" && !item.paidSyncedAtMs) + .map((item) => item.transactionId) + .filter(Boolean); return (
+
onFiltersChange({ appCode: event.target.value })} + onChange={(event) => onFiltersChange({ appCode: event.target.value, regionId: "" })} > 全部 APP {options.apps.map((app) => ( @@ -41,6 +61,21 @@ export function FinanceRechargeDetailList({ bills, error, filters, loading, onFi ))} + onFiltersChange({ regionId: event.target.value })} + > + 全部区域 + {regionOptions.map((region) => ( + + {region.name || region.regionCode || region.regionId} + + ))} + onFiltersChange({ keyword: event.target.value })} /> + @@ -131,6 +175,32 @@ export function FinanceRechargeDetailList({ bills, error, filters, loading, onFi ); } +function RechargeSummaryCards({ loading, summary }) { + const data = summary || EMPTY_RECHARGE_SUMMARY; + const cards = [ + { bucket: data.total, key: "total", label: "充值总和" }, + { bucket: data.thirdParty, key: "thirdParty", label: "三方充值" }, + { bucket: data.googlePlay, key: "googlePlay", label: "谷歌充值" }, + ]; + return ( +
+ {cards.map(({ bucket, key, label }) => ( +
+ {label} + + {loading ? "…" : formatUsdMinor(bucket.usdMinorAmount, "USD")} + + + {loading + ? "统计中" + : `${formatAmount(bucket.billCount)} 笔 · ${formatAmount(bucket.coinAmount)} 金币`} + +
+ ))} +
+ ); +} + function Stacked({ primary, secondary }) { return ( @@ -176,27 +246,58 @@ function userPaidText(item) { if (item.userPaidText) { return item.userPaidText; } - if (hasNumber(item.userPaidAmountMinor)) { - return formatUsdMinor(item.userPaidAmountMinor, item.currencyCode || "USD"); + if (hasPositiveNumber(item.userPaidAmountMicro) && item.userPaidCurrencyCode) { + return formatMicroMoney(item.userPaidAmountMicro, item.userPaidCurrencyCode); } - if (hasNumber(item.providerAmountMinor)) { - return formatUsdMinor(item.providerAmountMinor, item.currencyCode || "USD"); + if (isGoogleBill(item) && !item.paidSyncedAtMs) { + return "未同步(点“查询谷歌实付”)"; } - if (hasNumber(item.userPaidAmountMicro)) { - return formatMicroMoney(item.userPaidAmountMicro, item.currencyCode || "USD"); + if (hasPositiveNumber(item.userPaidAmountMinor)) { + return formatUsdMinor(item.userPaidAmountMinor, item.userPaidCurrencyCode || item.currencyCode || "USD"); } return "-"; } function taxDeductionText(item) { - const rate = formatPercent(item.taxRate); - const amount = - item.taxDeductionText || - (hasNumber(item.taxDeductionMinor) ? formatUsdMinor(item.taxDeductionMinor, item.currencyCode || "USD") : ""); - if (amount && rate) { - return `${amount} / ${rate}`; + const currency = item.userPaidCurrencyCode || item.currencyCode || "USD"; + const fee = hasPositiveNumber(item.providerFeeMicro) ? item.providerFeeMicro : 0; + const tax = hasPositiveNumber(item.providerTaxMicro) ? item.providerTaxMicro : 0; + const deduction = fee + tax; + if (deduction > 0) { + const parts = [formatMicroMoney(deduction, currency)]; + if (hasPositiveNumber(item.userPaidAmountMicro)) { + const percent = (deduction / item.userPaidAmountMicro) * 100; + parts.push(`${percent.toLocaleString("zh-CN", { maximumFractionDigits: 2 })}%`); + } + return ( + + {parts.join(" / ")} + {deductionBreakdown(fee, tax, currency)} + + ); } - return amount || rate || "-"; + if (item.taxDeductionText) { + return item.taxDeductionText; + } + if (isGoogleBill(item) && !item.paidSyncedAtMs) { + return "未同步"; + } + return "-"; +} + +function deductionBreakdown(fee, tax, currency) { + const parts = []; + if (fee > 0) { + parts.push(`手续费 ${formatMicroMoney(fee, currency)}`); + } + if (tax > 0) { + parts.push(`税费 ${formatMicroMoney(tax, currency)}`); + } + return parts.join(" + "); +} + +function isGoogleBill(item) { + return item.rechargeType === "google_play_recharge" || item.providerCode === "google_play"; } function hasNumber(value) { @@ -205,3 +306,7 @@ function hasNumber(value) { } return Number.isFinite(Number(value)); } + +function hasPositiveNumber(value) { + return hasNumber(value) && Number(value) > 0; +} diff --git a/finance/src/format.js b/finance/src/format.js index 1d93fbd..e491e3a 100644 --- a/finance/src/format.js +++ b/finance/src/format.js @@ -138,7 +138,12 @@ export function normalizeRechargeBill(item = {}) { exchangeUsdMinorAmount: numberValue(item.exchangeUsdMinorAmount ?? item.exchange_usd_minor_amount), externalRef: stringValue(item.externalRef ?? item.external_ref), id: stringValue(item.id ?? item.transactionId ?? item.transaction_id), + paidSyncedAtMs: numberOrNull(item.paidSyncedAtMs ?? item.paid_synced_at_ms), providerAmountMinor: numberOrNull(item.providerAmountMinor ?? item.provider_amount_minor), + providerCode: stringValue(item.providerCode ?? item.provider_code), + providerFeeMicro: numberOrNull(item.providerFeeMicro ?? item.provider_fee_micro), + providerNetMicro: numberOrNull(item.providerNetMicro ?? item.provider_net_micro), + providerTaxMicro: numberOrNull(item.providerTaxMicro ?? item.provider_tax_micro), rechargeType: stringValue(item.rechargeType ?? item.recharge_type), status: stringValue(item.status), taxDeductionMinor: numberOrNull( @@ -167,6 +172,7 @@ export function normalizeRechargeBill(item = {}) { item.providerAmountMinor ?? item.provider_amount_minor, ), + userPaidCurrencyCode: stringValue(item.userPaidCurrencyCode ?? item.user_paid_currency_code), userPaidText: stringValue( item.userPaidText ?? item.user_paid_text ?? @@ -188,6 +194,61 @@ export function normalizeRechargeBillPage(data = {}) { }; } +const EMPTY_RECHARGE_SUMMARY_BUCKET = { billCount: 0, coinAmount: 0, usdMinorAmount: 0 }; + +export const EMPTY_RECHARGE_SUMMARY = { + googlePlay: EMPTY_RECHARGE_SUMMARY_BUCKET, + thirdParty: EMPTY_RECHARGE_SUMMARY_BUCKET, + total: EMPTY_RECHARGE_SUMMARY_BUCKET, +}; + +function normalizeRechargeSummaryBucket(bucket = {}) { + return { + billCount: numberValue(bucket.billCount ?? bucket.bill_count) || 0, + coinAmount: numberValue(bucket.coinAmount ?? bucket.coin_amount) || 0, + usdMinorAmount: numberValue(bucket.usdMinorAmount ?? bucket.usd_minor_amount) || 0, + }; +} + +export function normalizeRechargeSummary(data = {}) { + return { + googlePlay: normalizeRechargeSummaryBucket(data.googlePlay ?? data.google_play), + thirdParty: normalizeRechargeSummaryBucket(data.thirdParty ?? data.third_party), + total: normalizeRechargeSummaryBucket(data.total), + }; +} + +export function mergeRechargeSummaries(summaries = []) { + const merged = normalizeRechargeSummary({}); + for (const summary of summaries) { + for (const key of ["googlePlay", "thirdParty", "total"]) { + merged[key] = { + billCount: merged[key].billCount + summary[key].billCount, + coinAmount: merged[key].coinAmount + summary[key].coinAmount, + usdMinorAmount: merged[key].usdMinorAmount + summary[key].usdMinorAmount, + }; + } + } + return merged; +} + +export function normalizeRechargeRegions(data = {}) { + const items = Array.isArray(data.items) ? data.items : Array.isArray(data) ? data : []; + return items + .map((item) => { + const regionId = numberOrNull(item.regionId ?? item.region_id); + if (!regionId) { + return null; + } + return { + name: stringValue(item.name), + regionCode: stringValue(item.regionCode ?? item.region_code), + regionId, + }; + }) + .filter(Boolean); +} + export function operationLabel(value, operations = FINANCE_OPERATIONS) { return operations.find((item) => item.value === value)?.label || value || "-"; } @@ -199,6 +260,15 @@ export function rechargeTypeLabel(value) { if (value === "google_play_recharge") { return "谷歌充值"; } + if (value === "mifapay") { + return "三方充值 · MiFaPay"; + } + if (value === "v5pay") { + return "三方充值 · V5Pay"; + } + if (value === "usdt_trc20") { + return "三方充值 · USDT"; + } return value || "-"; } diff --git a/finance/src/styles/index.css b/finance/src/styles/index.css index 22ca7c7..a64a88d 100644 --- a/finance/src/styles/index.css +++ b/finance/src/styles/index.css @@ -173,7 +173,36 @@ a { } .finance-toolbar--recharge-details { - grid-template-columns: minmax(170px, 1fr) minmax(280px, 1.35fr) minmax(180px, 1fr) auto; + grid-template-columns: minmax(150px, 1fr) minmax(130px, 0.85fr) minmax(250px, 1.3fr) minmax(160px, 1fr) auto auto; +} + +.finance-summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(200px, 1fr)); + gap: var(--space-4); +} + +.finance-summary-card { + display: grid; + gap: 4px; + border: 1px solid var(--border); + border-radius: var(--radius-control); + background: var(--bg-card-strong); + padding: var(--space-4); +} + +.finance-summary-card__label { + color: var(--text-secondary); + font-size: 13px; +} + +.finance-summary-card__value { + font-size: 22px; + line-height: 1.2; +} + +.finance-summary-card small { + color: var(--text-tertiary); } .finance-error { @@ -411,7 +440,8 @@ a { .finance-form-grid, .finance-evidence-grid, - .finance-toolbar { + .finance-toolbar, + .finance-summary-grid { grid-template-columns: 1fr; } diff --git a/src/shared/api/generated/endpoints.ts b/src/shared/api/generated/endpoints.ts index be4cb62..ea583c5 100644 --- a/src/shared/api/generated/endpoints.ts +++ b/src/shared/api/generated/endpoints.ts @@ -120,6 +120,7 @@ export const API_OPERATIONS = { getInviteActivityRewardConfig: "getInviteActivityRewardConfig", getLuckyGiftConfig: "getLuckyGiftConfig", getLuckyGiftDrawSummary: "getLuckyGiftDrawSummary", + getRechargeBillSummary: "getRechargeBillSummary", getRedPacket: "getRedPacket", getRedPacketConfig: "getRedPacketConfig", getRegion: "getRegion", @@ -193,6 +194,7 @@ export const API_OPERATIONS = { listPrettyIds: "listPrettyIds", listRechargeBills: "listRechargeBills", listRechargeProducts: "listRechargeProducts", + listRechargeRegions: "listRechargeRegions", listRedPackets: "listRedPackets", listRegionBlocks: "listRegionBlocks", listRegions: "listRegions", @@ -235,6 +237,7 @@ export const API_OPERATIONS = { publishHostAgencyPolicy: "publishHostAgencyPolicy", recyclePrettyId: "recyclePrettyId", refresh: "refresh", + refreshGoogleRechargePaid: "refreshGoogleRechargePaid", rejectFinanceApplication: "rejectFinanceApplication", rejectFinanceWithdrawalApplication: "rejectFinanceWithdrawalApplication", replaceCoinSellerSalaryRates: "replaceCoinSellerSalaryRates", @@ -1078,6 +1081,13 @@ export const API_ENDPOINTS: Record = { permission: "lucky-gift:view", permissions: ["lucky-gift:view"] }, + getRechargeBillSummary: { + method: "GET", + operationId: API_OPERATIONS.getRechargeBillSummary, + path: "/v1/admin/payment/recharge-bills/summary", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, getRedPacket: { method: "GET", operationId: API_OPERATIONS.getRedPacket, @@ -1587,6 +1597,13 @@ export const API_ENDPOINTS: Record = { permission: "payment-product:view", permissions: ["payment-product:view"] }, + listRechargeRegions: { + method: "GET", + operationId: API_OPERATIONS.listRechargeRegions, + path: "/v1/admin/payment/recharge-regions", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, listRedPackets: { method: "GET", operationId: API_OPERATIONS.listRedPackets, @@ -1871,6 +1888,13 @@ export const API_ENDPOINTS: Record = { operationId: API_OPERATIONS.refresh, path: "/v1/auth/refresh" }, + refreshGoogleRechargePaid: { + method: "POST", + operationId: API_OPERATIONS.refreshGoogleRechargePaid, + path: "/v1/admin/payment/recharge-bills/google-paid/refresh", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, rejectFinanceApplication: { method: "POST", operationId: API_OPERATIONS.rejectFinanceApplication, diff --git a/src/shared/api/generated/schema.d.ts b/src/shared/api/generated/schema.d.ts index 93320ec..f7b6f12 100644 --- a/src/shared/api/generated/schema.d.ts +++ b/src/shared/api/generated/schema.d.ts @@ -1876,6 +1876,54 @@ export interface paths { patch?: never; trace?: never; }; + "/admin/payment/recharge-bills/summary": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getRechargeBillSummary"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/payment/recharge-bills/google-paid/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["refreshGoogleRechargePaid"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/payment/recharge-regions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["listRechargeRegions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/admin/payment/recharge-products": { parameters: { query?: never; @@ -6735,6 +6783,55 @@ export interface operations { 200: components["responses"]["RechargeBillPageResponse"]; }; }; + getRechargeBillSummary: { + parameters: { + query?: { + keyword?: string; + recharge_type?: string; + status?: string; + region_id?: number; + start_at_ms?: number; + end_at_ms?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + refreshGoogleRechargePaid: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + transactionIds: string[]; + }; + }; + }; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + listRechargeRegions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; listRechargeProducts: { parameters: { query?: never;