diff --git a/apps/backend/src/config/defaults.ts b/apps/backend/src/config/defaults.ts index e4d0cc10..97a00ae6 100644 --- a/apps/backend/src/config/defaults.ts +++ b/apps/backend/src/config/defaults.ts @@ -151,6 +151,7 @@ PfQTPNA++KsXtwRX9M6Re3vkTDRsutIIWKtj8jqhUbbYS3vzS8GJnAWavUFVkR15 cooldownSeconds: 60, dailyLimit: 10, }, + orderTimelineVisible: false, }, } } diff --git a/apps/backend/src/config/env-overrides.ts b/apps/backend/src/config/env-overrides.ts index 4d8b6607..9dafb1e6 100644 --- a/apps/backend/src/config/env-overrides.ts +++ b/apps/backend/src/config/env-overrides.ts @@ -165,6 +165,7 @@ export const ENV_OVERRIDES: readonly EnvOverride[] = [ integerEnv('WORKER_SMS_CODE_TTL_SECONDS', ['worker', 'sms', 'codeTtlSeconds']), integerEnv('WORKER_SMS_COOLDOWN_SECONDS', ['worker', 'sms', 'cooldownSeconds']), integerEnv('WORKER_SMS_DAILY_LIMIT', ['worker', 'sms', 'dailyLimit']), + booleanEnv('WORKER_ORDER_TIMELINE_VISIBLE', ['worker', 'orderTimelineVisible']), integerEnv('KUAISHOU_FEIFEI_TIMEOUT_MS', ['platforms', 'kuaishouFeifei', 'timeoutMs']), stringEnv('KUAISHOU_FEIFEI_NOTIFY_URL', ['platforms', 'kuaishouFeifei', 'notifyUrl']), kuaishouFeifeiProductRulesEnv('KUAISHOU_FEIFEI_PRODUCT_RULES_JSON', [ diff --git a/apps/backend/src/services/worker-platform/worker-service.ts b/apps/backend/src/services/worker-platform/worker-service.ts index e6900ae1..41bc562b 100644 --- a/apps/backend/src/services/worker-platform/worker-service.ts +++ b/apps/backend/src/services/worker-platform/worker-service.ts @@ -528,6 +528,7 @@ export async function getWorkerProfile(session: WorkerSession) { }, levelProgress, financeConfig, + orderTimelineVisible: runtimeConfig.worker.orderTimelineVisible === true, } } @@ -1037,6 +1038,12 @@ export async function listWorkerMyOrders(query: JsonObject = {}, session: Worker export async function getWorkerMyOrderEvents(workOrderId: number | string, session: WorkerSession) { requireActiveWorkerSession(session) + if (runtimeConfig.worker.orderTimelineVisible !== true) { + throw createHttpError('流转记录暂未对打手开放', { + statusCode: 403, + errorCode: 'work_order_events_worker_disabled', + }) + } const workOrder = await getRequiredWorkOrder(workOrderId) const workerId = Number(session.workerId) const sharingShare = await getWorkOrderShare(workOrder.id, workerId) diff --git a/apps/backend/src/types/runtime-config.ts b/apps/backend/src/types/runtime-config.ts index 6473b20f..3731969d 100644 --- a/apps/backend/src/types/runtime-config.ts +++ b/apps/backend/src/types/runtime-config.ts @@ -143,6 +143,8 @@ export type RuntimeConfig = { cooldownSeconds: number dailyLimit: number } + /** 打手端订单详情是否展示流转记录(默认关闭,仅后台可见) */ + orderTimelineVisible: boolean } cors: { allowedOrigins: string[] diff --git a/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx b/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx index b4652c52..bc634b06 100644 --- a/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx +++ b/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx @@ -35,6 +35,7 @@ import ImagePreviewList from '@/components/files/ImagePreviewList' import ImageUpload from '@/components/files/ImageUpload' import { fetchWorkerMyOrders, + fetchWorkerProfile, saveWorkerAcceptanceDraft, saveWorkerOrderNote, submitWorkerAcceptance, @@ -191,6 +192,14 @@ export default function WorkerOrdersPage() { const pagination = ordersQuery.data?.data.pagination const orders = ordersQuery.data?.data.items || [] + // 流转记录对打手是否可见(后台配置开关,默认关闭) + const profileQuery = useQuery({ + queryKey: ['worker-profile'], + queryFn: () => fetchWorkerProfile(), + retry: false, + }) + const orderTimelineVisible = profileQuery.data?.data.orderTimelineVisible === true + const overviewQuery = useQuery({ queryKey: ['worker-my-orders-overview'], queryFn: async () => { @@ -1104,13 +1113,14 @@ export default function WorkerOrdersPage() { ) : null} - - - + {orderTimelineVisible ? ( + + + + ) : null} ) : null} -