feat: 增加打手工单备注

This commit is contained in:
yml2213
2026-08-15 14:22:13 +08:00
parent af323af48e
commit 112a3272d2
9 changed files with 221 additions and 2 deletions
@@ -1,5 +1,6 @@
import {
CopyOutlined,
EditOutlined,
EyeOutlined,
PictureOutlined,
ReloadOutlined,
@@ -7,6 +8,7 @@ import {
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
AutoComplete,
App,
Button,
Card,
@@ -32,6 +34,7 @@ import {
cancelWorkerOrder,
fetchWorkerMyOrders,
saveWorkerAcceptanceDraft,
saveWorkerOrderNote,
submitWorkerAcceptance,
} from '@/services/worker'
import type {
@@ -56,6 +59,10 @@ type AcceptanceFormValues = {
note?: string
}
type WorkerNoteFormValues = {
note?: string
}
type DetailFieldItem = {
key: string
label: string
@@ -73,8 +80,10 @@ export default function WorkerOrdersPage() {
const [pageSize, setPageSize] = useState(20)
const [detailOrder, setDetailOrder] = useState<WorkOrder | null>(null)
const [editingOrder, setEditingOrder] = useState<WorkOrder | null>(null)
const [noteOrder, setNoteOrder] = useState<WorkOrder | null>(null)
const [acceptanceFiles, setAcceptanceFiles] = useState<UploadedFile[]>([])
const [form] = Form.useForm<AcceptanceFormValues>()
const [noteForm] = Form.useForm<WorkerNoteFormValues>()
const ordersQuery = useQuery({
queryKey: ['worker-my-orders', status, keyword, page, pageSize],
@@ -176,6 +185,24 @@ export default function WorkerOrdersPage() {
setDetailOrder(null)
}
function openNoteModal(order: WorkOrder) {
setNoteOrder(order)
noteForm.setFieldsValue({ note: String(order.workerNote || '') })
}
async function saveOrderNote(values: WorkerNoteFormValues) {
if (!noteOrder) return
try {
await saveWorkerOrderNote(noteOrder.workOrderId, String(values.note || '').trim())
message.success('备注已保存')
setNoteOrder(null)
noteForm.resetFields()
await refreshAll()
} catch (error) {
message.error(error instanceof Error ? error.message : '保存备注失败')
}
}
async function submitAcceptance(values: AcceptanceFormValues) {
if (!editingOrder) return
if (acceptanceFiles.length === 0) {
@@ -392,6 +419,23 @@ export default function WorkerOrdersPage() {
)
},
},
{
title: '备注',
width: 190,
render: (_, row) => (
<div className="cell-stack">
<Typography.Text
type={row.workerNote ? undefined : 'secondary'}
ellipsis={{ tooltip: row.workerNote || undefined }}
>
{row.workerNote || '未填写'}
</Typography.Text>
<Button size="small" icon={<EditOutlined />} onClick={() => openNoteModal(row)}>
</Button>
</div>
),
},
{
title: '操作',
width: 260,
@@ -520,7 +564,7 @@ export default function WorkerOrdersPage() {
setPageSize(nextPageSize)
},
}}
scroll={{ x: 1060 }}
scroll={{ x: 1440 }}
/>
</Space>
</Card>
@@ -672,6 +716,25 @@ export default function WorkerOrdersPage() {
) : null}
</Drawer>
<Modal
title={`订单备注 · ${noteOrder?.workOrderNo || ''}`}
open={Boolean(noteOrder)}
onCancel={() => {
setNoteOrder(null)
noteForm.resetFields()
}}
onOk={() => noteForm.submit()}
destroyOnHidden
>
<Form form={noteForm} layout="vertical" onFinish={saveOrderNote}>
<Form.Item label="备注" name="note">
<AutoComplete options={[{ value: '已安排' }, { value: '未安排' }]}>
<Input allowClear maxLength={100} placeholder="输入备注或选择状态" />
</AutoComplete>
</Form.Item>
</Form>
</Modal>
<Modal
title={
editingOrder
+7
View File
@@ -126,6 +126,13 @@ export function fetchWorkerMyOrders(params?: Record<string, unknown>) {
return apiGet<WorkerListResponse<WorkOrder>>('/api/v1/worker/orders', params)
}
export function saveWorkerOrderNote(workOrderId: number, note: string) {
return apiPost<{ order: WorkOrder }>(
`/api/v1/worker/orders/${workOrderId}/note`,
{ note },
)
}
export function submitWorkerAcceptance(
workOrderId: number,
payload: { note?: string; imageUrls?: string[]; files?: UploadedFile[] },
@@ -248,6 +248,7 @@ export type WorkOrder = {
acceptance: WorkerAcceptance
/** 暂存的验收草稿(未提交时保存于此,刷新不丢失;提交后清空) */
draftAcceptance: WorkerAcceptance
workerNote?: string
problemNote: string
worker: null | {
workerId: number