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}
-