资料字段支持下拉选项与买家截图,大厅按 VIP 等级延迟可见

资料字段:
- CollectField 支持 type(text/select) 与 options,规则字段语法 key:名称#选项1,选项2
- 默认字段改为游戏编号/游戏昵称/系统(安卓,苹果)/区服(QQ区,微信区),旧默认模板字段自动替换为新版
- 采集页与管理端补资料支持单选下拉与买家主页截图上传(新增公开上传接口)
- 管理端工单详情展示买家截图

VIP 延迟可见:
- 等级权限新增 visibleDelaySeconds(默认 VIP1=20s~VIP5=0s,可后台配置)
- 大厅按等级延迟过滤新发布工单,页面提示延迟规则
This commit is contained in:
yml2213
2026-08-01 18:14:37 +08:00
parent 70e64155bc
commit 2412df8b54
17 changed files with 252 additions and 31 deletions
@@ -1,9 +1,10 @@
import { SearchOutlined } from '@ant-design/icons'
import { App, Button, Card, Form, Input, Result, Space, Typography } from 'antd'
import { App, Button, Card, Form, Input, Radio, Result, Space, Typography } from 'antd'
import { useState } from 'react'
import ImageUpload from '@/components/files/ImageUpload'
import { lookupCollectOrder, submitCollectOrder } from '@/services/worker'
import type { CollectLookupOrder } from '@/types/worker-platform'
import type { CollectLookupOrder, UploadedFile } from '@/types/worker-platform'
export default function CollectPage() {
const { message } = App.useApp()
@@ -11,6 +12,7 @@ export default function CollectPage() {
const [lookupOrders, setLookupOrders] = useState<CollectLookupOrder[]>([])
const [lookupLoading, setLookupLoading] = useState(false)
const [submittingWorkOrderId, setSubmittingWorkOrderId] = useState(0)
const [screenshotsByOrder, setScreenshotsByOrder] = useState<Record<number, UploadedFile[]>>({})
const [complete, setComplete] = useState(false)
async function submitLookup(values: { orderNo: string }) {
@@ -35,6 +37,7 @@ export default function CollectPage() {
orderNo,
workOrderId: order.workOrderId,
fields: values,
screenshots: screenshotsByOrder[order.workOrderId] || [],
})
message.success(response.data.complete ? '当前商品资料已完善' : '当前商品资料已提交')
await refreshLookupOrders(orderNo, { allowCompleteWhenNotFound: true })
@@ -100,11 +103,34 @@ export default function CollectPage() {
key={field.key}
label={field.label}
name={field.key}
rules={field.required ? [{ required: true, message: `请填写${field.label}` }] : []}
rules={field.required ? [{ required: true, message: `选择/填写${field.label}` }] : []}
>
<Input />
{field.type === 'select' && (field.options || []).length > 0 ? (
<Radio.Group
options={(field.options || []).map((option) => ({
label: option,
value: option,
}))}
/>
) : (
<Input />
)}
</Form.Item>
))}
<Form.Item label="买家主页截图">
<ImageUpload
scene="collect-material"
scope="collect"
maxCount={5}
value={screenshotsByOrder[currentOrder.workOrderId] || []}
onChange={(files) =>
setScreenshotsByOrder((prev) => ({
...prev,
[currentOrder.workOrderId]: files,
}))
}
/>
</Form.Item>
<Button
type="primary"
htmlType="submit"