打手端待审撤单与未处理反馈订单归入问题单分组并标注来源角标

This commit is contained in:
yml2213
2026-08-22 15:04:30 +08:00
parent 061bc2636d
commit 2224dd06d3
14 changed files with 249 additions and 41 deletions
@@ -31,6 +31,7 @@ import {
getDisplayOrderNo,
getMaterialDetailItems,
getMaterialScreenshots,
getOrderFlagTags,
getOrderStatusDisplay,
getSettlementLabel,
getUniqueAcceptanceFiles,
@@ -228,6 +229,7 @@ function WorkerOrderMobileCard({
const noteText = getWorkerAcceptance(order)?.note
const workerNote = String(order.workerNote || '').trim()
const statusDisplay = getOrderStatusDisplay(order)
const flagTags = getOrderFlagTags(order)
return (
<article className="worker-order-mobile-card">
@@ -248,6 +250,11 @@ function WorkerOrderMobileCard({
</Tag>
) : null}
{flagTags.map((flag) => (
<Tag key={flag.key} color={flag.color} className="worker-order-mobile-tag">
{flag.label}
</Tag>
))}
<span className="worker-order-mobile-orderno-text">{getDisplayOrderNo(order)}</span>
</div>
<div className="worker-order-mobile-header-right">
@@ -26,6 +26,7 @@ import {
getDisplayOrderNo,
getMaterialDetailItems,
getMaterialScreenshots,
getOrderFlagTags,
getOrderStatusDisplay,
getUniqueAcceptanceFiles,
getWorkerAcceptance,
@@ -102,6 +103,7 @@ export function buildWorkerOrderTableColumns({
width: 130,
render: (_, row) => {
const statusDisplay = getOrderStatusDisplay(row)
const flagTags = getOrderFlagTags(row)
return (
<div className="cell-stack">
<Space wrap size={4}>
@@ -115,6 +117,15 @@ export function buildWorkerOrderTableColumns({
<GiftCountdownTag giftAvailableAt={row.gift.giftAvailableAt} />
) : null}
</Space>
{flagTags.length > 0 ? (
<Space wrap size={4}>
{flagTags.map((flag) => (
<Tag key={flag.key} color={flag.color}>
{flag.label}
</Tag>
))}
</Space>
) : null}
{row.status === 'problem' && String(row.problemNote || '').trim() ? (
<Typography.Text
type="danger"
@@ -223,13 +223,19 @@ export default function WorkerOrdersPage() {
}
function markOrderAsRead(order: WorkOrder) {
if (!order.isUnread) return
queryClient.setQueriesData({ queryKey: ['worker-my-orders'] }, (current: unknown) =>
patchWorkOrderReadState(current, order.workOrderId),
)
void markWorkerOrderRead(order.workOrderId).catch(() => {
void queryClient.invalidateQueries({ queryKey: ['worker-my-orders'] })
})
if (order.isUnread) {
queryClient.setQueriesData({ queryKey: ['worker-my-orders'] }, (current: unknown) =>
patchWorkOrderReadState(current, order.workOrderId),
)
}
// 每次打开详情都刷新资料查看时间,用于清除"资料已更新"角标。
void markWorkerOrderRead(order.workOrderId, { materialSeen: true })
.then(() => {
void queryClient.invalidateQueries({ queryKey: ['worker-my-orders'] })
})
.catch(() => {
void queryClient.invalidateQueries({ queryKey: ['worker-my-orders'] })
})
}
function openOrderDetail(order: WorkOrder) {
@@ -72,6 +72,17 @@ export function getOrderStatusDisplay(order: WorkOrder): { label: string; color:
return { label: formatStatus(order.status), color: resolveStatusColor(order.status) }
}
/** 问题单来源与资料更新的订单角标,桌面表格与移动卡片共用。 */
export function getOrderFlagTags(order: WorkOrder) {
const flags: Array<{ key: string; label: string; color: string }> = []
if (order.problemMarked) flags.push({ key: 'problem', label: '平台标记', color: 'red' })
if (order.pendingCancelRequest)
flags.push({ key: 'cancel', label: '撤单审核中', color: 'orange' })
if (order.pendingFeedback) flags.push({ key: 'feedback', label: '反馈处理中', color: 'orange' })
if (order.materialUpdated) flags.push({ key: 'material', label: '资料已更新', color: 'blue' })
return flags
}
export function getOrderStatusHint(order: WorkOrder) {
if (isFriendGiftOrder(order) && order.status === 'in_progress' && order.gift) {
const hints: Record<string, string> = {
+5 -2
View File
@@ -270,8 +270,11 @@ export function submitWorkerOrderFeedback(workOrderId: number, payload: { conten
)
}
export function markWorkerOrderRead(workOrderId: number) {
return apiPost<{ viewedAt: string; isUnread: false }>(`/api/v1/worker/orders/${workOrderId}/read`)
export function markWorkerOrderRead(workOrderId: number, options: { materialSeen?: boolean } = {}) {
return apiPost<{ viewedAt: string; isUnread: false }>(
`/api/v1/worker/orders/${workOrderId}/read`,
{ materialSeen: options.materialSeen === true },
)
}
export function saveWorkerOrderNote(workOrderId: number, note: string) {
@@ -548,6 +548,11 @@ export type WorkOrder = {
/** 打手本人尚未点击查看或操作过该工单。 */
isUnread?: boolean
problemNote: string
/** 问题单分组来源角标:平台标记 / 撤单审核中 / 反馈处理中 / 资料已更新。 */
problemMarked?: boolean
pendingCancelRequest?: boolean
pendingFeedback?: boolean
materialUpdated?: boolean
/** 取消信息,仅已取消工单返回。 */
cancel?: {
reason: string