移除平台配置中的 91卡券 Tab
该入口并非平台配置,仅为订单运维队列,已从后台平台配置页删除相关 UI 与前端 API 封装。
This commit is contained in:
@@ -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,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user