增加接单工单客服备注
This commit is contained in:
@@ -67,6 +67,7 @@ import {
|
||||
submitAdminWorkOrderMaterial,
|
||||
unpublishAdminWorkOrder,
|
||||
updateAdminWorkOrder,
|
||||
updateAdminWorkOrderNote,
|
||||
updateAdminWorkOrderSharing,
|
||||
} from '@/services/admin'
|
||||
import type { UploadedFile, WorkOrder, WorkOrderShare } from '@/types/worker-platform'
|
||||
@@ -223,6 +224,7 @@ export default function WorkOrdersPanel() {
|
||||
const [assignOrder, setAssignOrder] = useState<WorkOrder | null>(null)
|
||||
const [assignWorkerId, setAssignWorkerId] = useState<number | undefined>(undefined)
|
||||
const [editOrder, setEditOrder] = useState<WorkOrder | null>(null)
|
||||
const [noteOrder, setNoteOrder] = useState<WorkOrder | null>(null)
|
||||
const [deductOrder, setDeductOrder] = useState<WorkOrder | null>(null)
|
||||
const [cancelOrder, setCancelOrder] = useState<WorkOrder | null>(null)
|
||||
const [problemForm] = Form.useForm()
|
||||
@@ -241,6 +243,7 @@ export default function WorkOrdersPanel() {
|
||||
timeoutMinutes?: number
|
||||
timeoutPolicy?: string
|
||||
}>()
|
||||
const [noteForm] = Form.useForm<{ note?: string }>()
|
||||
const [sharingForm] = Form.useForm<{
|
||||
enabled?: boolean
|
||||
totalQuantity?: number
|
||||
@@ -710,6 +713,25 @@ export default function WorkOrdersPanel() {
|
||||
})
|
||||
}
|
||||
|
||||
function openNoteModal(row: WorkOrder) {
|
||||
setNoteOrder(row)
|
||||
noteForm.setFieldsValue({ note: row.adminNote || '' })
|
||||
}
|
||||
|
||||
async function submitNote(values: { note?: string }) {
|
||||
if (!noteOrder) return
|
||||
const succeeded = await runAction(
|
||||
() => updateAdminWorkOrderNote(noteOrder.workOrderId, String(values.note || '')),
|
||||
'工单备注已保存',
|
||||
)
|
||||
if (!succeeded) return
|
||||
if (detailOrder?.workOrderId === noteOrder.workOrderId) {
|
||||
setDetailOrder({ ...detailOrder, adminNote: String(values.note || '').trim() })
|
||||
}
|
||||
setNoteOrder(null)
|
||||
noteForm.resetFields()
|
||||
}
|
||||
|
||||
function openDeductModal(row: WorkOrder) {
|
||||
setDeductOrder(row)
|
||||
deductForm.setFieldsValue({
|
||||
@@ -974,6 +996,15 @@ export default function WorkOrdersPanel() {
|
||||
{cancelText}
|
||||
</Typography.Text>
|
||||
) : null}
|
||||
{String(row.adminNote || '').trim() ? (
|
||||
<Typography.Text
|
||||
type="secondary"
|
||||
style={{ fontSize: 12, maxWidth: 140 }}
|
||||
ellipsis={{ tooltip: row.adminNote }}
|
||||
>
|
||||
备注:{row.adminNote}
|
||||
</Typography.Text>
|
||||
) : null}
|
||||
</div>
|
||||
)
|
||||
},
|
||||
@@ -1027,6 +1058,11 @@ export default function WorkOrdersPanel() {
|
||||
render: (_, row) => (
|
||||
<Space wrap>
|
||||
<Button onClick={() => openDetailDrawer(row)}>详情</Button>
|
||||
{canEditOrder ? (
|
||||
<Button icon={<FormOutlined />} onClick={() => openNoteModal(row)}>
|
||||
备注
|
||||
</Button>
|
||||
) : null}
|
||||
{row.capabilities?.canEdit && canEditOrder ? (
|
||||
<Button icon={<EditOutlined />} onClick={() => openEditModal(row)}>
|
||||
编辑
|
||||
@@ -1502,6 +1538,22 @@ export default function WorkOrdersPanel() {
|
||||
{String(detailOrder.problemNote || '').trim() || '-'}
|
||||
</span>
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="客服备注" span={2}>
|
||||
<Space align="start">
|
||||
<span className="worker-order-detail-value">
|
||||
{String(detailOrder.adminNote || '').trim() || '-'}
|
||||
</span>
|
||||
{canEditOrder ? (
|
||||
<Button
|
||||
size="small"
|
||||
icon={<EditOutlined />}
|
||||
onClick={() => openNoteModal(detailOrder)}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
) : null}
|
||||
</Space>
|
||||
</Descriptions.Item>
|
||||
{detailOrder.cancel ? (
|
||||
<Descriptions.Item label="取消信息" span={2}>
|
||||
<span className="worker-order-detail-value">
|
||||
@@ -1683,6 +1735,34 @@ export default function WorkOrdersPanel() {
|
||||
</div>
|
||||
) : null}
|
||||
</Drawer>
|
||||
<Modal
|
||||
title={`客服备注 · ${getDisplayOrderNo(noteOrder)}`}
|
||||
open={Boolean(noteOrder)}
|
||||
onCancel={() => {
|
||||
setNoteOrder(null)
|
||||
noteForm.resetFields()
|
||||
}}
|
||||
onOk={() => noteForm.submit()}
|
||||
destroyOnHidden
|
||||
>
|
||||
{noteOrder ? (
|
||||
<Form form={noteForm} layout="vertical" onFinish={submitNote}>
|
||||
<Form.Item
|
||||
label="备注内容"
|
||||
name="note"
|
||||
rules={[{ max: 2000, message: '备注不能超过 2000 个字符' }]}
|
||||
extra="仅后台客服可见,不会展示给打手。"
|
||||
>
|
||||
<Input.TextArea
|
||||
rows={5}
|
||||
maxLength={2000}
|
||||
showCount
|
||||
placeholder="请输入本单客服备注"
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
) : null}
|
||||
</Modal>
|
||||
<Modal
|
||||
title={`编辑工单 · ${getDisplayOrderNo(editOrder)}`}
|
||||
open={Boolean(editOrder)}
|
||||
|
||||
@@ -628,6 +628,12 @@ export function updateAdminWorkOrder(
|
||||
)
|
||||
}
|
||||
|
||||
export function updateAdminWorkOrderNote(workOrderId: number, note: string) {
|
||||
return apiPut<{ order: WorkOrder }>(`/api/v1/admin/worker-platform/orders/${workOrderId}/note`, {
|
||||
note,
|
||||
})
|
||||
}
|
||||
|
||||
export function deleteAdminWorkOrder(workOrderId: number) {
|
||||
return apiDelete<{ deleted: boolean }>(`/api/v1/admin/worker-platform/orders/${workOrderId}`)
|
||||
}
|
||||
|
||||
@@ -576,6 +576,8 @@ export type WorkOrder = {
|
||||
acceptance: WorkerAcceptance
|
||||
/** 暂存的验收草稿(未提交时保存于此,刷新不丢失;提交后清空) */
|
||||
draftAcceptance: WorkerAcceptance
|
||||
/** 后台客服维护的工单备注。 */
|
||||
adminNote?: string
|
||||
workerNote?: string
|
||||
/** 打手本人尚未点击查看或操作过该工单。 */
|
||||
isUnread?: boolean
|
||||
|
||||
Reference in New Issue
Block a user