新增打手端滚动公告

This commit is contained in:
yml2213
2026-08-20 20:04:43 +08:00
parent 20b1066ba3
commit 6539e0fb21
15 changed files with 291 additions and 0 deletions
@@ -7,6 +7,7 @@ import PageHeader from '@/components/admin/PageHeader'
import { fetchAdminWorkerPlatformSummary } from '@/services/admin'
import { getAdminRole } from '@/utils/admin-auth'
import CategoriesPanel from './panels/CategoriesPanel'
import AnnouncementPanel from './panels/AnnouncementPanel'
import CancelRequestsPanel from './panels/CancelRequestsPanel'
import FinancePanel from './panels/FinancePanel'
import FeedbacksPanel from './panels/FeedbacksPanel'
@@ -56,6 +57,9 @@ export default function AdminWorkerPlatformPage() {
{ key: 'orders', label: '接单工单', children: <WorkOrdersPanel /> },
{ key: 'cancel-requests', label: '撤单审核', children: <CancelRequestsPanel /> },
{ key: 'feedbacks', label: '问题反馈', children: <FeedbacksPanel /> },
...(isAdmin
? [{ key: 'announcement', label: '公告管理', children: <AnnouncementPanel /> }]
: []),
{ key: 'rules', label: '接单模板', children: <ProductRulesPanel /> },
{ key: 'product-match', label: '匹配诊断', children: <ProductMatchPanel /> },
{ key: 'categories', label: '分类', children: <CategoriesPanel /> },
@@ -79,6 +83,7 @@ function loadActiveTabPreference(): string {
return saved === 'orders' ||
saved === 'cancel-requests' ||
saved === 'feedbacks' ||
saved === 'announcement' ||
saved === 'rules' ||
saved === 'product-match' ||
saved === 'categories' ||
@@ -99,6 +104,7 @@ function isWorkerPlatformTab(tab: string | null): tab is string {
'orders',
'cancel-requests',
'feedbacks',
'announcement',
'rules',
'product-match',
'categories',
@@ -0,0 +1,61 @@
import { useQuery, useQueryClient } from '@tanstack/react-query'
import { App, Button, Card, Form, Input, Space, Switch, Typography } from 'antd'
import { useEffect, useState } from 'react'
import { fetchAdminWorkerAnnouncement, saveAdminWorkerAnnouncement } from '@/services/admin'
import type { WorkerAnnouncementConfig } from '@/types/worker-platform'
export default function AnnouncementPanel() {
const { message } = App.useApp()
const queryClient = useQueryClient()
const [form] = Form.useForm<WorkerAnnouncementConfig>()
const [saving, setSaving] = useState(false)
const announcementQuery = useQuery({
queryKey: ['admin-worker-announcement'],
queryFn: fetchAdminWorkerAnnouncement,
})
useEffect(() => {
if (announcementQuery.data?.data) form.setFieldsValue(announcementQuery.data.data)
}, [announcementQuery.data, form])
async function saveAnnouncement(values: WorkerAnnouncementConfig) {
setSaving(true)
try {
await saveAdminWorkerAnnouncement({
enabled: values.enabled !== false,
content: String(values.content || '').trim(),
})
await queryClient.invalidateQueries({ queryKey: ['admin-worker-announcement'] })
message.success('公告已保存')
} catch (error) {
message.error(error instanceof Error ? error.message : '保存公告失败')
} finally {
setSaving(false)
}
}
return (
<Card title="打手端滚动公告" bordered={false}>
<Form form={form} layout="vertical" onFinish={saveAnnouncement} style={{ maxWidth: 760 }}>
<Form.Item name="enabled" valuePropName="checked" label="展示公告">
<Switch />
</Form.Item>
<Form.Item
name="content"
label="公告内容"
rules={[{ required: true, whitespace: true, message: '请填写公告内容' }]}
extra="公告会显示在打手端各页面顶部并横向滚动。"
>
<Input.TextArea rows={4} maxLength={300} showCount placeholder="请输入打手端公告内容" />
</Form.Item>
<Space>
<Button type="primary" htmlType="submit" loading={saving}>
</Button>
<Typography.Text type="secondary"></Typography.Text>
</Space>
</Form>
</Card>
)
}