优化工单资料与审核展示

This commit is contained in:
yml2213
2026-08-20 23:42:13 +08:00
parent b5d46b2381
commit 81a412323b
11 changed files with 56 additions and 20 deletions
@@ -82,7 +82,8 @@ export type WorkerCancelRequestRow = {
created_at: string
reviewed_at: string | null
updated_at: string
work_order_no?: string
platform_order_id?: string
shop_name?: string
product_name?: string
worker_username?: string
worker_display_name?: string
@@ -103,6 +104,7 @@ export type WorkerOrderFeedbackRow = {
updated_at: string
work_order_no?: string
product_name?: string
shop_name?: string
worker_username?: string
worker_display_name?: string
share_quantity?: number | null
@@ -63,13 +63,22 @@ const WORK_ORDER_SHARE_SELECT = `
const WORKER_CANCEL_REQUEST_SELECT = `
SELECT
cr.*,
wo.work_order_no,
COALESCE(NULLIF(BTRIM(wo.platform_order_id), ''), o.platform_order_id, ft.platform_order_id, '') AS platform_order_id,
COALESCE(
NULLIF(BTRIM(o.shop_name), ''),
NULLIF(BTRIM(o.shop_id), ''),
NULLIF(BTRIM(ft.shop_name), ''),
NULLIF(BTRIM(ft.shop_id), ''),
''
) AS shop_name,
wo.product_name,
wu.username AS worker_username,
wu.display_name AS worker_display_name,
wos.quantity AS share_quantity
FROM worker_order_cancel_requests cr
INNER JOIN work_orders wo ON wo.id = cr.work_order_id
LEFT JOIN orders o ON o.id = wo.order_id
LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id
INNER JOIN worker_users wu ON wu.id = cr.worker_id
LEFT JOIN work_order_shares wos ON wos.id = cr.work_order_share_id
`
@@ -79,11 +88,20 @@ const WORKER_ORDER_FEEDBACK_SELECT = `
wf.*,
COALESCE(NULLIF(BTRIM(wo.platform_order_id), ''), wo.work_order_no) AS work_order_no,
wo.product_name,
COALESCE(
NULLIF(BTRIM(o.shop_name), ''),
NULLIF(BTRIM(o.shop_id), ''),
NULLIF(BTRIM(ft.shop_name), ''),
NULLIF(BTRIM(ft.shop_id), ''),
''
) AS shop_name,
wu.username AS worker_username,
wu.display_name AS worker_display_name,
wos.quantity AS share_quantity
FROM worker_order_feedbacks wf
INNER JOIN work_orders wo ON wo.id = wf.work_order_id
LEFT JOIN orders o ON o.id = wo.order_id
LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id
INNER JOIN worker_users wu ON wu.id = wf.worker_id
LEFT JOIN work_order_shares wos ON wos.id = wf.work_order_share_id
`
@@ -99,7 +99,7 @@ export async function createWorkerAcceptanceAdminNotification(input: {
export async function createWorkerCancelRequestAdminNotification(input: {
requestId: number
workOrderId: number
workOrderNo: string
platformOrderId: string
productName: string
workerName: string
reason: string
@@ -112,7 +112,7 @@ export async function createWorkerCancelRequestAdminNotification(input: {
dedupeKey: `worker_cancel_request:${input.requestId}`,
title: '有打手撤单申请待审核',
body: [
`订单:${input.workOrderNo || input.workOrderId}`,
`订单:${input.platformOrderId || input.workOrderId}`,
`商品:${input.productName || '-'}`,
`打手:${input.workerName || '-'}`,
`原因:${input.reason || '-'}`,
@@ -1798,7 +1798,9 @@ export async function submitAdminWorkOrderMaterial(
},
}
const nextStatus =
hasActiveShares || workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
hasActiveShares ||
workOrder.status === WORK_ORDER_STATUS.OPEN ||
workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
? workOrder.status
: complete
? WORK_ORDER_STATUS.UNASSIGNED
@@ -1814,7 +1816,9 @@ export async function submitAdminWorkOrderMaterial(
actorType: 'admin',
actorId: actorName,
eventType:
hasActiveShares || workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
hasActiveShares ||
workOrder.status === WORK_ORDER_STATUS.OPEN ||
workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
? 'material_updated'
: 'material_completed',
fromStatus: workOrder.status,
@@ -281,8 +281,8 @@ export function mapWorkerCancelRequest(request: {
reviewed_by: string
created_at: string
reviewed_at: string | null
work_order_no?: string
product_name?: string
platform_order_id?: string
shop_name?: string
worker_username?: string
worker_display_name?: string
share_quantity?: number | null
@@ -292,8 +292,8 @@ export function mapWorkerCancelRequest(request: {
workOrderId: Number(request.work_order_id),
shareId: request.work_order_share_id ? Number(request.work_order_share_id) : null,
workerId: Number(request.worker_id),
workOrderNo: String(request.work_order_no || ''),
productName: String(request.product_name || ''),
platformOrderId: String(request.platform_order_id || ''),
shopName: String(request.shop_name || ''),
workerName: String(request.worker_display_name || request.worker_username || ''),
shareQuantity: request.share_quantity ? Number(request.share_quantity) : null,
reason: String(request.reason || ''),
@@ -318,6 +318,7 @@ export function mapWorkerOrderFeedback(feedback: {
handled_at: string | null
work_order_no?: string
product_name?: string
shop_name?: string
worker_username?: string
worker_display_name?: string
share_quantity?: number | null
@@ -329,6 +330,7 @@ export function mapWorkerOrderFeedback(feedback: {
workerId: Number(feedback.worker_id),
workOrderNo: String(feedback.work_order_no || ''),
productName: String(feedback.product_name || ''),
shopName: String(feedback.shop_name || ''),
workerName: String(feedback.worker_display_name || feedback.worker_username || ''),
shareQuantity: feedback.share_quantity ? Number(feedback.share_quantity) : null,
content: String(feedback.content || ''),
@@ -481,8 +483,8 @@ export function mapWorkOrderAdmin(workOrder: WorkOrderRow, shares?: WorkOrderSha
canUpdateMaterial:
workOrder.status === WORK_ORDER_STATUS.PENDING_MATERIAL ||
workOrder.status === WORK_ORDER_STATUS.UNASSIGNED ||
workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS ||
(workOrder.status === WORK_ORDER_STATUS.OPEN && hasActiveShares),
workOrder.status === WORK_ORDER_STATUS.OPEN ||
workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS,
canAccept: status === WORK_ORDER_STATUS.PENDING_ACCEPTANCE,
canMarkProblem:
status === WORK_ORDER_STATUS.IN_PROGRESS || status === WORK_ORDER_STATUS.PENDING_ACCEPTANCE,
@@ -773,6 +773,10 @@ test('mapWorkOrderForWorker 使用个人拼单份数、金额、状态和接单
})
test('后台拼单聚合状态同时收敛筛选语义和操作能力', () => {
const waitingForClaim = mapWorkOrderAdmin(buildWorkOrderRow({ status: 'open' }))
assert.equal(waitingForClaim.status, 'open')
assert.equal(waitingForClaim.capabilities.canUpdateMaterial, true)
const partial = mapWorkOrderAdmin(
buildWorkOrderRow({
status: 'open',
@@ -1867,7 +1867,7 @@ export async function submitWorkerCancelRequest(
await createWorkerCancelRequestAdminNotification({
requestId: Number(result.request.id),
workOrderId: Number(result.request.work_order_id),
workOrderNo: result.request.work_order_no || '',
platformOrderId: result.request.platform_order_id || '',
productName: result.request.product_name || '',
workerName: worker.display_name || worker.username,
reason,
@@ -82,12 +82,12 @@ export default function CancelRequestsPanel() {
const columns: TableColumnsType<WorkerCancelRequest> = [
{
title: '订单',
title: '订单号 / 店铺',
width: 260,
render: (_, request) => (
<div className="cell-stack">
<Typography.Text strong>{request.productName || '-'}</Typography.Text>
<Typography.Text type="secondary">{request.workOrderNo || '-'}</Typography.Text>
<Typography.Text strong>{request.platformOrderId || '-'}</Typography.Text>
<Typography.Text type="secondary">{request.shopName || '-'}</Typography.Text>
</div>
),
},
@@ -68,6 +68,7 @@ export default function FeedbacksPanel() {
<div className="cell-stack">
<Typography.Text strong>{feedback.productName || '-'}</Typography.Text>
<Typography.Text type="secondary">{feedback.workOrderNo || '-'}</Typography.Text>
<Typography.Text type="secondary">{feedback.shopName || '-'}</Typography.Text>
</div>
),
},
@@ -919,7 +919,7 @@ export default function WorkOrdersPanel() {
) : null}
{row.capabilities?.canUpdateMaterial ? (
<Button icon={<FormOutlined />} onClick={() => openMaterialModal(row)}>
{row.status === 'in_progress' ? '更新资料' : '补资料'}
{['open', 'in_progress'].includes(row.status) ? '更新资料' : '补资料'}
</Button>
) : null}
{row.capabilities?.canPublish ? (
@@ -1571,7 +1571,11 @@ export default function WorkOrdersPanel() {
</Modal>
<Modal
title={materialOrder?.status === 'in_progress' ? '更新订单资料' : '人工补充资料'}
title={
['open', 'in_progress'].includes(materialOrder?.status || '')
? '更新订单资料'
: '人工补充资料'
}
open={Boolean(materialOrder)}
onCancel={() => {
setMaterialOrder(null)
+3 -2
View File
@@ -107,8 +107,8 @@ export type WorkerCancelRequest = {
workOrderId: number
shareId: number | null
workerId: number
workOrderNo: string
productName: string
platformOrderId: string
shopName: string
workerName: string
shareQuantity: number | null
reason: string
@@ -134,6 +134,7 @@ export type WorkerOrderFeedback = {
workerId: number
workOrderNo: string
productName: string
shopName: string
workerName: string
shareQuantity: number | null
content: string