feat(worker-platform): 实现打手寄卖白名单权限控制与存量发布打手平滑过渡

1. 新增数据库迁移 082_worker_consignment_whitelist.sql,worker_users 表增加 can_consign 与 consignment_activated_at 字段,存量在 consignment_submissions 提报过的打手默认自动开启;
2. 打手端提报接口 publishWorkerConsignment 增加白名单权限服务端强校验拦截(403 consignment_permission_required);
3. 管理后台打手管理表格增加「寄卖权限」实时 Switch 开关列与打手详情抽屉权限展示,支持客服即时开通或关闭打手寄卖权限;
4. 打手端我要寄卖页面在未开通权限时展示专属白名单引导卡片,一键呼起联系客服开通寄卖弹窗;
5. 补充寄卖权限拦截与路由单测,前端59项单测与后端507项单测全部通过。
This commit is contained in:
yml2213
2026-09-21 13:30:33 +08:00
parent 0df5c9f34e
commit cb8b249e57
15 changed files with 295 additions and 1 deletions
@@ -11,6 +11,7 @@ import {
ReloadOutlined,
SafetyCertificateOutlined,
UserOutlined,
CustomerServiceOutlined,
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
@@ -36,6 +37,7 @@ import {
import { useEffect, useMemo, useRef, useState } from 'react'
import ImageUpload from '@/components/files/ImageUpload'
import { WorkerContactModal } from '@/components/worker/WorkerContactModal'
import {
confirmWorkerConsignmentFriendAdded,
fetchWorkerConsignmentPriceSuggestion,
@@ -198,6 +200,8 @@ export default function WorkerConsignmentPage() {
const publishDepositYuan = publishDepositFen / 100
const availableAmount = Number(worker?.wallet?.availableAmount || 0)
const canPublish = availableAmount >= publishDepositFen
const canConsign = worker?.canConsign !== false
const [contactOpen, setContactOpen] = useState(false)
const reviewingCount = records.filter((item) => item.group === 'reviewing').length
const activeCount = records.filter((item) => item.group === 'active').length
@@ -338,6 +342,11 @@ export default function WorkerConsignmentPage() {
}
async function handlePublishSubmit(values: Record<string, any>) {
if (!canConsign) {
message.warning('您暂未开通寄卖权限,请联系客服申请开通')
return
}
if (!canPublish) {
message.warning(`可用余额不足 ¥${publishDepositYuan.toFixed(0)},请先联系客服充值履约押金`)
return
@@ -579,7 +588,33 @@ export default function WorkerConsignmentPage() {
<DollarCircleOutlined /> 发布寄卖
</span>
),
children: (
children: !canConsign ? (
<div style={{ padding: '36px 16px', textAlign: 'center' }}>
<Empty
image={Empty.PRESENTED_IMAGE_SIMPLE}
description={
<div style={{ maxWidth: 420, margin: '0 auto' }}>
<Typography.Title level={5} style={{ marginBottom: 8 }}>
寄卖功能暂未开通
</Typography.Title>
<Typography.Paragraph
type="secondary"
style={{ fontSize: 13, marginBottom: 20 }}
>
为保障寄卖道具交付质量与履约安全,平台当前实行白名单审核制。请联系在线客服申请开通寄卖权限。
</Typography.Paragraph>
<Button
type="primary"
icon={<CustomerServiceOutlined />}
onClick={() => setContactOpen(true)}
>
联系客服开通寄卖
</Button>
</div>
}
/>
</div>
) : (
<Form
form={form}
layout="vertical"
@@ -929,6 +964,15 @@ export default function WorkerConsignmentPage() {
/>
</Space>
</Modal>
<WorkerContactModal
open={contactOpen}
onClose={() => setContactOpen(false)}
isMobile={isMobile}
worker={worker}
financeConfig={financeConfig}
title="联系客服开通寄卖"
/>
</section>
)
}