feat: 增加打手工单备注
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user