feat(files): 新增前端上传与订单证据图片

This commit is contained in:
yml2213
2026-10-30 14:08:11 +08:00
parent 8499dac163
commit 4fc4e9236b
5 changed files with 324 additions and 14 deletions
@@ -15,6 +15,7 @@ import {
Typography,
} from 'antd'
import { EvidenceUpload } from '@/components/EvidenceUpload'
import {
acceptCheckout,
cancelMyOrder,
@@ -37,6 +38,7 @@ import {
} from '@/features/orders/orderActions'
import type { UserOrderDetail } from '@/features/orders/types'
import { useSessionStore } from '@/stores/session'
import { confirmModal } from '@/shared/utils/confirm'
import { formatMoney } from '@/shared/utils/format'
type DialogKind = 'pay' | 'handoff' | 'checkout' | 'counter' | 'dispute' | null
@@ -49,6 +51,7 @@ interface ActionFormValues {
otherYuan?: number
reason?: string
evidenceText?: string
evidenceUrls?: string[]
disputeType?: string
}
@@ -82,6 +85,11 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
}
}
const evidencePayload = (values: ActionFormValues) => [
...(values.evidenceUrls ?? []),
...splitEvidenceLines(values.evidenceText ?? ''),
]
const openDialog = (kind: Exclude<DialogKind, null>) => {
form.resetFields()
setPayURL('')
@@ -95,6 +103,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
coinConsumed: checkout?.coin_consumed_m ?? 0,
otherYuan: 0,
evidenceText: '',
evidenceUrls: [],
})
}
if (kind === 'counter') {
@@ -104,6 +113,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
otherYuan: (checkout?.deposit_deduct_amount_cent ?? 0) / 100,
reason: '',
evidenceText: '',
evidenceUrls: [],
})
}
if (kind === 'dispute') {
@@ -111,6 +121,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
disputeType: actions.checkoutDisputeStage ? 'checkout_dispute' : 'cannot_login',
content: '',
evidenceText: '',
evidenceUrls: [],
})
}
setDialog(kind)
@@ -186,7 +197,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
}
const submitReceive = async () => {
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: '确认收号',
content: '请确认账号可以正常登录、资料与交接说明一致。确认后订单进入使用中。',
okText: '确认收号',
@@ -202,7 +213,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
const submitCheckout = async () => {
const values = await readForm()
if (!values) return
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: '确认提交结账',
content: '结账会直接影响租金、押金赔付与双方结算金额,提交后将发送给对方确认。',
okText: '提交结账',
@@ -215,7 +226,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
consumable_amount_cent: yuanToCent(values.consumableYuan ?? 0),
coin_consumed_m: toPositiveNumber(values.coinConsumed ?? 0),
other_amount_cent: yuanToCent(values.otherYuan ?? 0),
evidence_urls: splitEvidenceLines(values.evidenceText ?? ''),
evidence_urls: evidencePayload(values),
})
message.success('结账已发起,等待对方确认')
})
@@ -226,7 +237,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
message.warning('押金不足,请修改方案或发起争议')
return
}
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: '确认结账',
content: '确认账号状态和扣款金额无误吗?确认后订单将完成。',
okText: '确认结账',
@@ -244,7 +255,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
message.warning('押金不足,请修改方案或发起争议')
return
}
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: '同意结账方案',
content: '确定同意当前结账方案吗?同意后订单将完成结算。',
okText: '同意结账',
@@ -268,7 +279,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
coin_consumed_m: toPositiveNumber(values.coinConsumed ?? 0),
other_amount_cent: yuanToCent(values.otherYuan ?? 0),
deposit_deduct_amount_cent: yuanToCent(values.otherYuan ?? 0),
evidence_urls: splitEvidenceLines(values.evidenceText ?? ''),
evidence_urls: evidencePayload(values),
})
message.success('结账方案已修改,等待对方处理')
})
@@ -277,7 +288,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
const submitDispute = async () => {
const values = await readForm()
if (!values) return
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: actions.checkoutDisputeStage ? '发起结账争议' : '发起申诉',
content: '提交后订单会进入仲裁流程,客服会根据双方证据处理。确定提交吗?',
okText: '提交',
@@ -288,14 +299,14 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
await createOrderDispute(order.id, {
type: actions.checkoutDisputeStage ? 'checkout_dispute' : values.disputeType ?? 'other',
description: values.content ?? '',
evidence_urls: splitEvidenceLines(values.evidenceText ?? ''),
evidence_urls: evidencePayload(values),
})
message.success('申诉已提交')
})
}
const cancelDispute = async () => {
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: '取消申诉',
content: '取消后订单会恢复到发起申诉前的流程,确定继续吗?',
okText: '取消申诉',
@@ -310,7 +321,7 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
const cancelOrder = async () => {
const refundReview = order.status === 'pending_handoff'
const confirmed = await modal.confirm({
const confirmed = await confirmModal(modal, {
title: refundReview ? '申请取消订单' : '取消订单',
content: refundReview
? '订单已支付,取消后需要客服审核退款,审核通过前账号仍会保持占用。'
@@ -551,8 +562,11 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
<InputNumber min={0} precision={2} style={{ width: 160 }} />
</Form.Item>
</Space>
<Form.Item name="evidenceText" label="证据链接(每行一条,可选)">
<Input.TextArea rows={3} placeholder="https://..." />
<Form.Item name="evidenceUrls" label="证据图片(可选)">
<EvidenceUpload scene="handoff" max={6} />
</Form.Item>
<Form.Item name="evidenceText" label="外部证据链接(每行一条,可选)">
<Input.TextArea rows={2} placeholder="https://..." />
</Form.Item>
</Form>
) : null}
@@ -581,8 +595,11 @@ export function OrderActionPanel({ order, onChanged }: OrderActionPanelProps) {
>
<Input.TextArea rows={5} maxLength={1000} showCount />
</Form.Item>
<Form.Item name="evidenceText" label="证据链接(每行一条,可选)">
<Input.TextArea rows={3} placeholder="https://..." />
<Form.Item name="evidenceUrls" label="证据图片(可选)">
<EvidenceUpload scene="dispute" max={6} />
</Form.Item>
<Form.Item name="evidenceText" label="外部证据链接(每行一条,可选)">
<Input.TextArea rows={2} placeholder="https://..." />
</Form.Item>
</Form>
) : null}