接单工单支持编辑与删除,修复编辑押金不生效问题
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import {
|
||||
CheckOutlined,
|
||||
DeleteOutlined,
|
||||
EditOutlined,
|
||||
FormOutlined,
|
||||
PlusOutlined,
|
||||
ReloadOutlined,
|
||||
@@ -41,6 +43,7 @@ import {
|
||||
createAdminMockWorkOrder,
|
||||
creditAdminWorkerWallet,
|
||||
deleteAdminWorkCategory,
|
||||
deleteAdminWorkOrder,
|
||||
deleteAdminWorkerLevel,
|
||||
fetchAdminWorkerFinanceConfig,
|
||||
fetchAdminWorkerFinanceRequests,
|
||||
@@ -63,6 +66,7 @@ import {
|
||||
submitAdminWorkOrderMaterial,
|
||||
syncAdminWorkerOrdersFromSource,
|
||||
unpublishAdminWorkOrder,
|
||||
updateAdminWorkOrder,
|
||||
updateAdminWorkOrderSharing,
|
||||
} from '@/services/admin'
|
||||
import type {
|
||||
@@ -114,9 +118,18 @@ export default function WorkOrdersPanel() {
|
||||
const [materialOrder, setMaterialOrder] = useState<WorkOrder | null>(null)
|
||||
const [materialScreenshots, setMaterialScreenshots] = useState<UploadedFile[]>([])
|
||||
const [sharingOrder, setSharingOrder] = useState<WorkOrder | null>(null)
|
||||
const [editOrder, setEditOrder] = useState<WorkOrder | null>(null)
|
||||
const [problemForm] = Form.useForm()
|
||||
const [resolutionForm] = Form.useForm()
|
||||
const [materialForm] = Form.useForm()
|
||||
const [editForm] = Form.useForm<{
|
||||
productName?: string
|
||||
platformOrderId?: string
|
||||
categoryId?: number | null
|
||||
rewardAmount?: number
|
||||
requiredDepositAmount?: number
|
||||
fieldsText?: string
|
||||
}>()
|
||||
const [sharingForm] = Form.useForm<{
|
||||
enabled?: boolean
|
||||
totalQuantity?: number
|
||||
@@ -129,6 +142,10 @@ export default function WorkOrdersPanel() {
|
||||
queryFn: () => fetchAdminWorkOrders({ status, page, pageSize }),
|
||||
})
|
||||
const ordersPagination = ordersQuery.data?.data.pagination
|
||||
const categoriesQuery = useQuery({
|
||||
queryKey: ['admin-worker-platform-categories'],
|
||||
queryFn: () => fetchAdminWorkCategories(),
|
||||
})
|
||||
const sharingQuery = useQuery({
|
||||
queryKey: ['admin-worker-platform-order-sharing', sharingOrder?.workOrderId],
|
||||
queryFn: () => fetchAdminWorkOrderSharing(Number(sharingOrder?.workOrderId)),
|
||||
@@ -293,6 +310,61 @@ export default function WorkOrdersPanel() {
|
||||
setDetailOrder(row)
|
||||
}
|
||||
|
||||
function openEditModal(row: WorkOrder) {
|
||||
setEditOrder(row)
|
||||
editForm.setFieldsValue({
|
||||
productName: row.productName,
|
||||
platformOrderId: row.platformOrderId || '',
|
||||
categoryId: row.categoryId ?? undefined,
|
||||
rewardAmount: Math.round(Number(row.rewardAmount || 0)) / 100,
|
||||
requiredDepositAmount:
|
||||
Math.round(Number(row.requiredDepositAmount || 0)) / 100,
|
||||
fieldsText: formatRequirementFieldsText(getRequirementFields(row)),
|
||||
})
|
||||
}
|
||||
|
||||
async function submitEdit(values: {
|
||||
productName?: string
|
||||
platformOrderId?: string
|
||||
categoryId?: number | null
|
||||
rewardAmount?: number
|
||||
requiredDepositAmount?: number
|
||||
fieldsText?: string
|
||||
}) {
|
||||
if (!editOrder) return
|
||||
const succeeded = await runAction(
|
||||
() =>
|
||||
updateAdminWorkOrder(editOrder.workOrderId, {
|
||||
productName: String(values.productName || '').trim(),
|
||||
platformOrderId: String(values.platformOrderId || '').trim(),
|
||||
categoryId: values.categoryId || null,
|
||||
rewardAmount: Number(values.rewardAmount || 0),
|
||||
requiredDepositAmount: Number(values.requiredDepositAmount || 0),
|
||||
fieldsText: String(values.fieldsText || ''),
|
||||
}),
|
||||
'工单信息已保存',
|
||||
)
|
||||
if (!succeeded) return
|
||||
setEditOrder(null)
|
||||
editForm.resetFields()
|
||||
}
|
||||
|
||||
function requestDeleteWorkOrder(row: WorkOrder) {
|
||||
modal.confirm({
|
||||
title: `确认删除工单 ${row.workOrderNo}?`,
|
||||
content:
|
||||
'删除后工单将从列表中移除,且不可恢复。仅未分配、待完善或已取消且无拼单参与的工单可删除。',
|
||||
okText: '确认删除',
|
||||
okButtonProps: { danger: true },
|
||||
cancelText: '取消',
|
||||
onOk: () =>
|
||||
runAction(
|
||||
() => deleteAdminWorkOrder(row.workOrderId),
|
||||
'工单已删除',
|
||||
),
|
||||
})
|
||||
}
|
||||
|
||||
const columns: TableColumnsType<WorkOrder> = [
|
||||
{
|
||||
title: '订单',
|
||||
@@ -383,6 +455,23 @@ export default function WorkOrdersPanel() {
|
||||
render: (_, row) => (
|
||||
<Space wrap>
|
||||
<Button onClick={() => openDetailDrawer(row)}>详情</Button>
|
||||
{['pending_material', 'unassigned', 'open'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<EditOutlined />}
|
||||
onClick={() => openEditModal(row)}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
) : null}
|
||||
{['pending_material', 'unassigned', 'cancelled'].includes(row.status) ? (
|
||||
<Button
|
||||
danger
|
||||
icon={<DeleteOutlined />}
|
||||
onClick={() => requestDeleteWorkOrder(row)}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
) : null}
|
||||
{['pending_material', 'unassigned', 'open'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<TeamOutlined />}
|
||||
@@ -710,6 +799,68 @@ export default function WorkOrdersPanel() {
|
||||
) : null}
|
||||
</Drawer>
|
||||
|
||||
<Modal
|
||||
title={`编辑工单 · ${editOrder?.workOrderNo || ''}`}
|
||||
open={Boolean(editOrder)}
|
||||
onCancel={() => {
|
||||
setEditOrder(null)
|
||||
editForm.resetFields()
|
||||
}}
|
||||
onOk={() => editForm.submit()}
|
||||
destroyOnHidden
|
||||
width={720}
|
||||
>
|
||||
{editOrder ? (
|
||||
<Form form={editForm} layout="vertical" onFinish={submitEdit}>
|
||||
<Form.Item
|
||||
label="商品"
|
||||
name="productName"
|
||||
rules={[{ required: true, message: '请填写商品名称' }]}
|
||||
>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item label="平台订单号" name="platformOrderId">
|
||||
<Input placeholder="留空表示无平台订单号" />
|
||||
</Form.Item>
|
||||
<Form.Item label="分类" name="categoryId">
|
||||
<Select
|
||||
allowClear
|
||||
placeholder="选择接单分类"
|
||||
options={(categoriesQuery.data?.data.items || [])
|
||||
.filter((category) => category.status === 'active')
|
||||
.map((category) => ({
|
||||
label: category.name,
|
||||
value: category.categoryId,
|
||||
}))}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="接单金额"
|
||||
name="rewardAmount"
|
||||
rules={[{ required: true, message: '请填写接单金额' }]}
|
||||
tooltip="打手看到的接单报酬"
|
||||
>
|
||||
<InputNumber min={0.01} step={1} addonAfter="元" />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="冻结押金"
|
||||
name="requiredDepositAmount"
|
||||
rules={[{ required: true, message: '请填写冻结押金' }]}
|
||||
tooltip="抢单时需要冻结的押金,0 表示无需押金"
|
||||
>
|
||||
<InputNumber min={0} step={1} addonAfter="元" />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="资料字段"
|
||||
name="fieldsText"
|
||||
extra="每行一个字段:key:名称,下拉项用 # 分隔(如 system:系统#安卓,苹果)"
|
||||
>
|
||||
<Input.TextArea rows={5} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
) : null}
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
title="标记问题单"
|
||||
open={Boolean(problemOrder)}
|
||||
@@ -952,6 +1103,18 @@ export default function WorkOrdersPanel() {
|
||||
)
|
||||
}
|
||||
|
||||
function formatRequirementFieldsText(fields: CollectField[]): string {
|
||||
return fields
|
||||
.map((field) => {
|
||||
const labelPart = `${field.key}:${field.label}`
|
||||
const options = (field.options || []).filter(Boolean)
|
||||
return options.length > 0
|
||||
? `${labelPart}#${options.join(',')}`
|
||||
: labelPart
|
||||
})
|
||||
.join('\n')
|
||||
}
|
||||
|
||||
function MockWorkOrderForm({ onCreated }: { onCreated: () => Promise<void> }) {
|
||||
const { message } = App.useApp()
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
Reference in New Issue
Block a user