移除平台配置中的 91卡券 Tab

该入口并非平台配置,仅为订单运维队列,已从后台平台配置页删除相关 UI 与前端 API 封装。
This commit is contained in:
yml2213
2026-07-10 21:51:53 +08:00
parent 407afe203e
commit f6ea07912f
6 changed files with 3 additions and 290 deletions
@@ -30,22 +30,19 @@ import { useEffect, useState } from 'react'
import { useSearchParams } from 'react-router' import { useSearchParams } from 'react-router'
import PageHeader from '@/components/admin/PageHeader' import PageHeader from '@/components/admin/PageHeader'
import { isFeedbackDismissed, showError, showPrompt, showSuccess } from '@/lib/feedback' import { showError, showSuccess } from '@/lib/feedback'
import { import {
deleteAdminCloudtentaclesSource, deleteAdminCloudtentaclesSource,
exchangeAdminKuaishouIndustryAuthorizationCode, exchangeAdminKuaishouIndustryAuthorizationCode,
failAdminNinetyoneOrder,
fetchAdminCloudtentaclesAsset, fetchAdminCloudtentaclesAsset,
fetchAdminCloudtentaclesSkuList, fetchAdminCloudtentaclesSkuList,
fetchAdminCloudtentaclesSourceConfig, fetchAdminCloudtentaclesSourceConfig,
fetchAdminKuaishouFeifeiConfig, fetchAdminKuaishouFeifeiConfig,
fetchAdminKuaishouIndustrySourceConfig, fetchAdminKuaishouIndustrySourceConfig,
fetchAdminNinetyoneOrders,
fetchAdminNotificationConfig, fetchAdminNotificationConfig,
fetchAdminScheduledJobsConfig, fetchAdminScheduledJobsConfig,
matchAdminKuaishouFeifeiProduct, matchAdminKuaishouFeifeiProduct,
refreshAdminKuaishouIndustryAccessToken, refreshAdminKuaishouIndustryAccessToken,
retryAdminNinetyoneOrder,
runAdminScheduledJob, runAdminScheduledJob,
saveAdminCloudtentaclesSourceConfig, saveAdminCloudtentaclesSourceConfig,
saveAdminKuaishouFeifeiConfig, saveAdminKuaishouFeifeiConfig,
@@ -69,8 +66,6 @@ import type {
AdminKuaishouFeifeiConfigResponse, AdminKuaishouFeifeiConfigResponse,
AdminKuaishouFeifeiMatchResult, AdminKuaishouFeifeiMatchResult,
AdminKuaishouFeifeiProductRule, AdminKuaishouFeifeiProductRule,
AdminNinetyoneOrderItem,
AdminNinetyoneOrderListResult,
AdminNotificationConfig, AdminNotificationConfig,
AdminNotificationTestResult, AdminNotificationTestResult,
AdminScheduledJobAccountRuntime, AdminScheduledJobAccountRuntime,
@@ -80,15 +75,10 @@ import type {
AdminScheduledJobsConfig, AdminScheduledJobsConfig,
} from '@/types/admin' } from '@/types/admin'
import { hasAdminRole } from '@/utils/admin-auth' import { hasAdminRole } from '@/utils/admin-auth'
import { import { buildAdminLocalTablePagination } from '@/utils/admin-pagination'
ADMIN_DEFAULT_PAGE_SIZE,
buildAdminLocalTablePagination,
buildAdminTablePagination,
} from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time' import { formatAdminDateTime } from '@/utils/admin-time'
type PlatformTab = type PlatformTab =
| 'ninetyone'
| 'notifications' | 'notifications'
| 'kuaishouIndustry' | 'kuaishouIndustry'
| 'kuaishouFeifei' | 'kuaishouFeifei'
@@ -107,7 +97,6 @@ type ScheduledJobsState = {
} }
const platformTabs: PlatformTab[] = [ const platformTabs: PlatformTab[] = [
'ninetyone',
'notifications', 'notifications',
'kuaishouIndustry', 'kuaishouIndustry',
'kuaishouFeifei', 'kuaishouFeifei',
@@ -125,7 +114,6 @@ export default function AdminPlatformShopsPage() {
const [feifeiConfig, setFeifeiConfig] = useState<AdminKuaishouFeifeiConfigResponse | null>(null) const [feifeiConfig, setFeifeiConfig] = useState<AdminKuaishouFeifeiConfigResponse | null>(null)
const [cloudtentaclesConfig, setCloudtentaclesConfig] = const [cloudtentaclesConfig, setCloudtentaclesConfig] =
useState<AdminCloudtentaclesSourceConfigResponse | null>(null) useState<AdminCloudtentaclesSourceConfigResponse | null>(null)
const [ninetyoneData, setNinetyoneData] = useState<AdminNinetyoneOrderListResult | null>(null)
useEffect(() => { useEffect(() => {
void loadConfigs() void loadConfigs()
@@ -147,14 +135,12 @@ export default function AdminPlatformShopsPage() {
industryResponse, industryResponse,
feifeiResponse, feifeiResponse,
cloudtentaclesResponse, cloudtentaclesResponse,
ninetyoneResponse,
] = await Promise.all([ ] = await Promise.all([
fetchAdminNotificationConfig(), fetchAdminNotificationConfig(),
fetchAdminScheduledJobsConfig(), fetchAdminScheduledJobsConfig(),
fetchAdminKuaishouIndustrySourceConfig(), fetchAdminKuaishouIndustrySourceConfig(),
fetchAdminKuaishouFeifeiConfig(), fetchAdminKuaishouFeifeiConfig(),
fetchAdminCloudtentaclesSourceConfig(), fetchAdminCloudtentaclesSourceConfig(),
fetchAdminNinetyoneOrders({ page: 1, pageSize: 20 }),
]) ])
setNotificationConfig(notificationResponse.data) setNotificationConfig(notificationResponse.data)
@@ -162,7 +148,6 @@ export default function AdminPlatformShopsPage() {
setIndustryConfig(industryResponse.data) setIndustryConfig(industryResponse.data)
setFeifeiConfig(feifeiResponse.data) setFeifeiConfig(feifeiResponse.data)
setCloudtentaclesConfig(cloudtentaclesResponse.data) setCloudtentaclesConfig(cloudtentaclesResponse.data)
setNinetyoneData(ninetyoneResponse.data)
} catch (error) { } catch (error) {
setErrorMessage(error instanceof Error ? error.message : '读取平台配置失败') setErrorMessage(error instanceof Error ? error.message : '读取平台配置失败')
} finally { } finally {
@@ -204,16 +189,6 @@ export default function AdminPlatformShopsPage() {
onChange={updateActiveTab} onChange={updateActiveTab}
className="platform-tabs" className="platform-tabs"
items={[ items={[
{
key: 'ninetyone',
label: '91卡券',
children: (
<NinetyonePanel
data={ninetyoneData}
onDataChange={setNinetyoneData}
/>
),
},
{ {
key: 'notifications', key: 'notifications',
label: '内部通知', label: '内部通知',
@@ -274,184 +249,6 @@ export default function AdminPlatformShopsPage() {
) )
} }
function NinetyonePanel({
data,
onDataChange,
}: {
data: AdminNinetyoneOrderListResult | null
onDataChange: (data: AdminNinetyoneOrderListResult) => void
}) {
const [loading, setLoading] = useState(false)
const [actionLoadingId, setActionLoadingId] = useState('')
const [status, setStatus] = useState('')
const page = data?.page || 1
const pageSize = data?.pageSize || 20
async function loadOrders(nextPage = page, nextPageSize = pageSize, nextStatus = status) {
setLoading(true)
try {
const response = await fetchAdminNinetyoneOrders({
page: nextPage,
pageSize: nextPageSize,
status: nextStatus || undefined,
})
onDataChange(response.data)
} catch (error) {
showError(error instanceof Error ? error.message : '读取 91 卡券订单失败')
} finally {
setLoading(false)
}
}
async function retryOrder(order: AdminNinetyoneOrderItem) {
setActionLoadingId(`retry-${order.orderId}`)
try {
await retryAdminNinetyoneOrder(order.orderId)
showSuccess('已重新处理 91 卡券订单')
await loadOrders()
} catch (error) {
showError(error instanceof Error ? error.message : '重试订单失败')
} finally {
setActionLoadingId('')
}
}
async function failOrder(order: AdminNinetyoneOrderItem) {
try {
const result = await showPrompt('请输入失败原因', '标记订单失败')
setActionLoadingId(`fail-${order.orderId}`)
await failAdminNinetyoneOrder(order.orderId, { reason: result.value })
showSuccess('已标记 91 卡券订单失败')
await loadOrders()
} catch (error) {
if (!isFeedbackDismissed(error)) {
showError(error instanceof Error ? error.message : '标记失败订单失败')
}
} finally {
setActionLoadingId('')
}
}
const columns: TableColumnsType<AdminNinetyoneOrderItem> = [
{
title: '订单',
dataIndex: 'orderNo',
minWidth: 220,
render: (_, row) => (
<div className="cell-stack">
<Typography.Text strong>{row.orderNo || '-'}</Typography.Text>
<Typography.Text type="secondary">{row.outTradeNo || '-'}</Typography.Text>
</div>
),
},
{
title: '商品',
dataIndex: 'productName',
minWidth: 260,
render: (_, row) => (
<div className="cell-stack">
<span>{row.productName || '-'}</span>
<span className="muted">{row.productNo || '-'} · {row.buyNum || 0}</span>
</div>
),
},
{
title: '店铺',
minWidth: 160,
render: (_, row) => row.shopName || row.shopId || '-',
},
{
title: '状态',
minWidth: 160,
render: (_, row) => (
<Space wrap size={[0, 6]}>
<Tag>{row.orderStatus || '-'}</Tag>
<Tag color={row.payStatus === 'paid' ? 'green' : undefined}>{row.payStatus || '-'}</Tag>
</Space>
),
},
{
title: '任务',
dataIndex: 'taskCount',
width: 110,
render: (value) => `${Number(value || 0)}`,
},
{
title: '时间',
dataIndex: 'createdAt',
width: 180,
render: (value) => formatAdminDateTime(value),
},
{
title: '操作',
fixed: 'right',
width: 180,
render: (_, row) => (
<Space>
<Button
size="small"
loading={actionLoadingId === `retry-${row.orderId}`}
onClick={() => retryOrder(row)}
>
</Button>
<Button
danger
size="small"
loading={actionLoadingId === `fail-${row.orderId}`}
onClick={() => failOrder(row)}
>
</Button>
</Space>
),
},
]
return (
<Card
title="91 卡券来源订单"
extra={
<Space wrap>
<Select
allowClear
value={status || undefined}
placeholder="处理状态"
style={{ width: 160 }}
options={[
{ label: '待处理', value: 'pending' },
{ label: '失败', value: 'failed' },
{ label: '已完成', value: 'completed' },
]}
onChange={(nextStatus) => {
const normalized = String(nextStatus || '')
setStatus(normalized)
void loadOrders(1, pageSize, normalized)
}}
/>
<Button icon={<ReloadOutlined />} loading={loading} onClick={() => loadOrders()}>
</Button>
</Space>
}
>
<Table<AdminNinetyoneOrderItem>
rowKey="orderId"
loading={loading}
columns={columns}
dataSource={data?.items || []}
scroll={{ x: 1200 }}
pagination={buildAdminTablePagination({
current: data?.page || 1,
pageSize: data?.pageSize || ADMIN_DEFAULT_PAGE_SIZE,
total: data?.total || 0,
onChange: (nextPage, nextPageSize) => loadOrders(nextPage, nextPageSize),
})}
/>
</Card>
)
}
function NotificationPanel({ function NotificationPanel({
notificationConfig, notificationConfig,
scheduledJobs, scheduledJobs,
@@ -2323,5 +2120,5 @@ function LabeledInput({
function normalizePlatformTab(value: unknown): PlatformTab { function normalizePlatformTab(value: unknown): PlatformTab {
return typeof value === 'string' && platformTabs.includes(value as PlatformTab) return typeof value === 'string' && platformTabs.includes(value as PlatformTab)
? (value as PlatformTab) ? (value as PlatformTab)
: 'ninetyone' : 'notifications'
} }
@@ -1,6 +1,5 @@
export * from './notifications' export * from './notifications'
export * from './scheduled-jobs' export * from './scheduled-jobs'
export * from './ninetyone'
export * from './kuaishou-industry' export * from './kuaishou-industry'
export * from './kuaishou-feifei' export * from './kuaishou-feifei'
export * from './cloudtentacles' export * from './cloudtentacles'
@@ -1,42 +0,0 @@
import { apiGet, apiPost } from '@/lib/http'
import type {
AdminNinetyoneOrderActionResult,
AdminNinetyoneOrderListResult,
} from '@/types/admin'
export function fetchAdminNinetyoneOrders(
params: {
page?: number
pageSize?: number
status?: string
} = {},
) {
const searchParams = new URLSearchParams()
if (params.page) {
searchParams.set('page', String(params.page))
}
if (params.pageSize) {
searchParams.set('pageSize', String(params.pageSize))
}
if (params.status) {
searchParams.set('status', params.status)
}
const queryString = searchParams.toString()
return apiGet<AdminNinetyoneOrderListResult>(
`/api/v1/admin/platform-config/ninetyone/orders${queryString ? `?${queryString}` : ''}`,
)
}
export function retryAdminNinetyoneOrder(orderId: number | string) {
return apiPost<AdminNinetyoneOrderActionResult>(
`/api/v1/admin/platform-config/ninetyone/orders/${orderId}/retry`,
{},
)
}
export function failAdminNinetyoneOrder(orderId: number | string, payload: { reason?: string }) {
return apiPost<AdminNinetyoneOrderActionResult>(
`/api/v1/admin/platform-config/ninetyone/orders/${orderId}/fail`,
payload,
)
}
-3
View File
@@ -56,9 +56,6 @@ export type {
AdminScheduledJobsConfig, AdminScheduledJobsConfig,
AdminScheduledJobRuntimeState, AdminScheduledJobRuntimeState,
AdminScheduledJobsResponse, AdminScheduledJobsResponse,
AdminNinetyoneOrderItem,
AdminNinetyoneOrderListResult,
AdminNinetyoneOrderActionResult,
AdminKuaishouIndustryAccessTokenStatus, AdminKuaishouIndustryAccessTokenStatus,
AdminKuaishouIndustryShopConfig, AdminKuaishouIndustryShopConfig,
AdminKuaishouIndustrySourceConfig, AdminKuaishouIndustrySourceConfig,
@@ -16,12 +16,6 @@ export type {
AdminScheduledJobsResponse, AdminScheduledJobsResponse,
} from './scheduled-jobs' } from './scheduled-jobs'
export type {
AdminNinetyoneOrderItem,
AdminNinetyoneOrderListResult,
AdminNinetyoneOrderActionResult,
} from './ninetyone'
export type { export type {
AdminKuaishouIndustryAccessTokenStatus, AdminKuaishouIndustryAccessTokenStatus,
AdminKuaishouIndustryShopConfig, AdminKuaishouIndustryShopConfig,
@@ -1,32 +0,0 @@
export interface AdminNinetyoneOrderItem {
orderId: number
orderNo: string
outTradeNo: string
orderStatus: string
payStatus: string
shopId: string
shopName: string
productNo: string
productName: string
buyNum: number
taskCount: number
failReason: string
createdAt: string
updatedAt: string
items: Array<Record<string, unknown>>
}
export interface AdminNinetyoneOrderListResult {
page: number
pageSize: number
total: number
items: AdminNinetyoneOrderItem[]
}
export interface AdminNinetyoneOrderActionResult {
orderId: number
orderNo: string
orderStatus: string
orderItemCount: number
taskCount: number
}