优化撤单处理方式
This commit is contained in:
@@ -131,6 +131,11 @@ type MaterialFormValues = {
|
||||
rewardAmount?: number
|
||||
}
|
||||
|
||||
type CancelOrderFormValues = {
|
||||
action?: 'return_to_hall' | 'cancel_order'
|
||||
reason?: string
|
||||
}
|
||||
|
||||
export default function WorkOrdersPanel() {
|
||||
const { message, modal } = App.useApp()
|
||||
const navigate = useNavigate()
|
||||
@@ -154,9 +159,11 @@ export default function WorkOrdersPanel() {
|
||||
const [assignWorkerId, setAssignWorkerId] = useState<number | undefined>(undefined)
|
||||
const [editOrder, setEditOrder] = useState<WorkOrder | null>(null)
|
||||
const [deductOrder, setDeductOrder] = useState<WorkOrder | null>(null)
|
||||
const [cancelOrder, setCancelOrder] = useState<WorkOrder | null>(null)
|
||||
const [problemForm] = Form.useForm()
|
||||
const [resolutionForm] = Form.useForm()
|
||||
const [materialForm] = Form.useForm<MaterialFormValues>()
|
||||
const [cancelForm] = Form.useForm<CancelOrderFormValues>()
|
||||
const [deductForm] = Form.useForm<{ amount?: number; note?: string }>()
|
||||
const [editForm] = Form.useForm<{
|
||||
productName?: string
|
||||
@@ -208,6 +215,11 @@ export default function WorkOrdersPanel() {
|
||||
setAssignWorkerId(undefined)
|
||||
}
|
||||
|
||||
function openCancelModal(row: WorkOrder) {
|
||||
setCancelOrder(row)
|
||||
cancelForm.setFieldsValue({ action: 'return_to_hall', reason: '' })
|
||||
}
|
||||
|
||||
function applyMaterialPaste(text: string) {
|
||||
if (!materialOrder) return
|
||||
const recognized = parseWorkerMaterialText(text)
|
||||
@@ -383,6 +395,24 @@ export default function WorkOrdersPanel() {
|
||||
resolutionForm.resetFields()
|
||||
}
|
||||
|
||||
async function submitCancelOrder(values: CancelOrderFormValues) {
|
||||
if (!cancelOrder || !values.action) return
|
||||
const action = values.action
|
||||
const succeeded = await runAction(
|
||||
() =>
|
||||
cancelAdminWorkOrder(cancelOrder.workOrderId, {
|
||||
action,
|
||||
reason: String(values.reason || '').trim(),
|
||||
}),
|
||||
action === 'return_to_hall'
|
||||
? '订单已退回大厅,打手额度已恢复'
|
||||
: '订单已取消,打手额度已恢复',
|
||||
)
|
||||
if (!succeeded) return
|
||||
setCancelOrder(null)
|
||||
cancelForm.resetFields()
|
||||
}
|
||||
|
||||
async function submitMaterial(values: MaterialFormValues) {
|
||||
if (!materialOrder) return
|
||||
const succeeded = await runAction(
|
||||
@@ -716,27 +746,7 @@ export default function WorkOrdersPanel() {
|
||||
<Button
|
||||
danger
|
||||
icon={<UndoOutlined />}
|
||||
onClick={() => {
|
||||
const assignedWorker = row.worker
|
||||
if (!assignedWorker) return
|
||||
modal.confirm({
|
||||
title: '确认撤单?',
|
||||
content: (
|
||||
<span>
|
||||
将取消 {assignedWorker.displayName || assignedWorker.username} 正在代练的订单,订单不会重新发布到大厅,
|
||||
打手接单额度和冻结押金将恢复。
|
||||
</span>
|
||||
),
|
||||
okText: '确认撤单',
|
||||
cancelText: '取消',
|
||||
okButtonProps: { danger: true },
|
||||
onOk: () =>
|
||||
runAction(
|
||||
() => cancelAdminWorkOrder(row.workOrderId),
|
||||
'已撤单并恢复打手额度',
|
||||
),
|
||||
})
|
||||
}}
|
||||
onClick={() => openCancelModal(row)}
|
||||
>
|
||||
撤单
|
||||
</Button>
|
||||
@@ -1318,6 +1328,68 @@ export default function WorkOrdersPanel() {
|
||||
</Form>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
title={`撤单处理 · ${getDisplayOrderNo(cancelOrder)}`}
|
||||
open={Boolean(cancelOrder)}
|
||||
onCancel={() => {
|
||||
setCancelOrder(null)
|
||||
cancelForm.resetFields()
|
||||
}}
|
||||
onOk={() => cancelForm.submit()}
|
||||
destroyOnHidden
|
||||
>
|
||||
{cancelOrder ? (
|
||||
<Form
|
||||
form={cancelForm}
|
||||
layout="vertical"
|
||||
initialValues={{ action: 'return_to_hall' }}
|
||||
onFinish={submitCancelOrder}
|
||||
>
|
||||
<Alert
|
||||
showIcon
|
||||
type="warning"
|
||||
message="处理后都会恢复打手接单额度和冻结押金,请确认处理方式。"
|
||||
style={{ marginBottom: 16 }}
|
||||
/>
|
||||
<Form.Item
|
||||
label="处理方式"
|
||||
name="action"
|
||||
rules={[{ required: true, message: '请选择撤单处理方式' }]}
|
||||
>
|
||||
<Radio.Group>
|
||||
<Space direction="vertical">
|
||||
<Radio value="return_to_hall">退回大厅:订单重新开放给其他打手接单</Radio>
|
||||
<Radio value="cancel_order">取消订单:用户退款后终止订单,不再回大厅</Radio>
|
||||
</Space>
|
||||
</Radio.Group>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="处理原因"
|
||||
name="reason"
|
||||
dependencies={['action']}
|
||||
rules={[
|
||||
({ getFieldValue }) => ({
|
||||
validator(_, value) {
|
||||
if (
|
||||
getFieldValue('action') !== 'cancel_order' ||
|
||||
String(value || '').trim()
|
||||
) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
return Promise.reject(new Error('取消订单时请填写退款或撤单原因'))
|
||||
},
|
||||
}),
|
||||
]}
|
||||
>
|
||||
<Input.TextArea
|
||||
rows={3}
|
||||
placeholder="取消订单时请填写退款原因;退回大厅可选填"
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
) : null}
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
title={materialOrder?.status === 'in_progress' ? '更新订单资料' : '人工补充资料'}
|
||||
open={Boolean(materialOrder)}
|
||||
|
||||
@@ -149,9 +149,16 @@ export function unassignAdminWorkOrder(workOrderId: number) {
|
||||
)
|
||||
}
|
||||
|
||||
export function cancelAdminWorkOrder(workOrderId: number) {
|
||||
export function cancelAdminWorkOrder(
|
||||
workOrderId: number,
|
||||
payload: {
|
||||
action: 'return_to_hall' | 'cancel_order'
|
||||
reason?: string
|
||||
},
|
||||
) {
|
||||
return apiPost<{ order: WorkOrder }>(
|
||||
`/api/v1/admin/worker-platform/orders/${workOrderId}/cancel`,
|
||||
payload,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user