From ecdbacd745fe99bcb0a1a9725a89d200a0e791af Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 15 Aug 2026 10:07:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=A2=E6=9C=8D=E5=8F=AF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=B7=A5=E5=8D=95=EF=BC=8C=E5=95=86=E5=93=81=E5=90=8D?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E7=BC=96=E8=BE=91=EF=BC=8C=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=88=97=E6=98=BE=E7=A4=BA=E6=9D=A5=E6=BA=90=E5=BA=97=E9=93=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 工单编辑接口放开 support 角色,客服可双击改发单金额/押金及商品名 - 订单列商品名支持双击原地修改(单击看详情不变) - 订单列新增来源/店铺展示;Mock 工单补充店铺信息并回填存量数据 --- .../src/routes/admin/worker-platform.ts | 2 +- .../services/worker-platform/admin-service.ts | 3 + .../pages/admin/panels/WorkOrdersPanel.tsx | 132 +++++++++++++++--- 3 files changed, 120 insertions(+), 17 deletions(-) diff --git a/apps/backend/src/routes/admin/worker-platform.ts b/apps/backend/src/routes/admin/worker-platform.ts index d7c40d4c..92ada148 100644 --- a/apps/backend/src/routes/admin/worker-platform.ts +++ b/apps/backend/src/routes/admin/worker-platform.ts @@ -325,7 +325,7 @@ router.post( router.put( '/worker-platform/orders/:workOrderId', - requireAdminRoles(['admin', 'operator']), + requireAdminRoles(['admin', 'operator', 'support']), createJsonHandler( (req) => updateAdminWorkOrder(String(req.params.workOrderId || ''), req.body || {}), { diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index 0a1f4fdc..2a3175db 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -834,6 +834,9 @@ export async function createAdminMockWorkOrder(payload: JsonObject = {}) { orderAmountFen: paymentFen, syncSource: 'mock', mock: true, + provider: 'mock', + platform: 'mock', + shopName: '模拟店铺', }, } const workOrder = await createWorkOrder({ diff --git a/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx b/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx index 1f4b70b5..c1eafcb0 100644 --- a/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx +++ b/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx @@ -483,24 +483,38 @@ export default function WorkOrdersPanel() { { title: '订单', minWidth: 300, - render: (_, row) => ( -
- openDetailDrawer(row)}> - {row.productName || row.workOrderNo} - - - {row.categoryName ? {row.categoryName} : null} - {row.orderId ? ( - - 源订单 #{row.orderId} + render: (_, row) => { + const source = asRecord(row.material?.source) + const shopName = String(source.shopName || '').trim() + const provider = String(source.provider || '').trim() + return ( +
+ openDetailDrawer(row)} + onSaved={refreshAll} + /> + + {row.categoryName ? {row.categoryName} : null} + {row.orderId ? ( + + 源订单 #{row.orderId} + + ) : null} + + {shopName || provider ? ( + + {provider ? `来源:${provider}` : ''} + {provider && shopName ? ' · ' : ''} + {shopName ? `店铺:${shopName}` : ''} ) : null} - - - {row.platformOrderId} · {row.workOrderNo} - -
- ), + + {row.platformOrderId} · {row.workOrderNo} + +
+ ) + }, }, { title: '用户付款金额', @@ -1438,6 +1452,92 @@ function getUserPaymentFen(order: WorkOrder): number | null { return Number.isFinite(paymentFen) ? paymentFen : null } +/** 商品名:单击看详情,双击原地修改(仅未接走工单) */ +function ProductNameEditableCell({ + order, + onOpenDetail, + onSaved, +}: { + order: WorkOrder + onOpenDetail: () => void + onSaved: () => Promise | void +}) { + const { message } = App.useApp() + const [editing, setEditing] = useState(false) + const [draft, setDraft] = useState('') + const savingRef = useRef(false) + const clickTimerRef = useRef(null) + + const editable = + ['pending_material', 'unassigned', 'open'].includes(order.status) && !order.worker + + function handleClick() { + if (clickTimerRef.current) window.clearTimeout(clickTimerRef.current) + clickTimerRef.current = window.setTimeout(() => onOpenDetail(), 260) + } + + function handleDoubleClick() { + if (clickTimerRef.current) { + window.clearTimeout(clickTimerRef.current) + clickTimerRef.current = null + } + if (!editable) return + setDraft(order.productName || order.workOrderNo) + setEditing(true) + } + + async function save() { + if (savingRef.current) return + const next = draft.trim() + if (!next) { + message.error('商品名不能为空') + return + } + if (next === order.productName) { + setEditing(false) + return + } + savingRef.current = true + try { + await updateAdminWorkOrder(order.workOrderId, { productName: next }) + message.success('商品名已更新') + setEditing(false) + await onSaved() + } catch (error) { + message.error(error instanceof Error ? error.message : '保存失败') + } finally { + savingRef.current = false + } + } + + if (!editing) { + return ( + + {order.productName || order.workOrderNo} + + ) + } + + return ( + setDraft(event.target.value)} + onPressEnter={() => void save()} + onBlur={() => void save()} + onKeyDown={(event) => { + if (event.key === 'Escape') setEditing(false) + }} + /> + ) +} + function AmountEditableCell({ order, field,