diff --git a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts index 0fe5a92a..d8e84d86 100644 --- a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts +++ b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts @@ -14,6 +14,7 @@ import { normalizeWithdrawChannel, normalizeRequirementFields, mapWorkOrderForWorker, + maskWorkerLeaderboardDisplayName, resolveCollectSubmitTargetWorkOrder, resolveMatchingProductRuleDecision, resolveWorkerPermissions, @@ -130,6 +131,12 @@ test('接单密码必须包含大小写字母、数字和标点符号', () => { assert.throws(() => validateWorkerPassword('Aa123456'), { errorCode: 'worker_password_invalid' }) }) +test('排行榜打手名称仅展示首字符', () => { + assert.equal(maskWorkerLeaderboardDisplayName('张三'), '张****') + assert.equal(maskWorkerLeaderboardDisplayName('Alice'), 'A****') + assert.equal(maskWorkerLeaderboardDisplayName(''), '****') +}) + test('快手具体 SKU 精确规则优先于大标题包含规则', () => { const decision = resolveMatchingProductRuleDecision(buildOrderRow(), buildOrderItemRow(), [ buildProductRule(), diff --git a/apps/backend/src/services/worker-platform/worker-service.ts b/apps/backend/src/services/worker-platform/worker-service.ts index d421d176..9f72c338 100644 --- a/apps/backend/src/services/worker-platform/worker-service.ts +++ b/apps/backend/src/services/worker-platform/worker-service.ts @@ -1158,7 +1158,12 @@ export async function getWorkerHallLeaderboard(session: WorkerSession) { }) const current = entries.find((entry) => entry.workerId === session.workerId) return { - items: entries.filter((entry) => entry.rank <= 10), + items: entries + .filter((entry) => entry.rank <= 10) + .map((entry) => ({ + ...entry, + displayName: maskWorkerLeaderboardDisplayName(entry.displayName), + })), current: { rank: current?.rank || null, acceptedOrderCount: current?.acceptedOrderCount || 0, @@ -1166,6 +1171,11 @@ export async function getWorkerHallLeaderboard(session: WorkerSession) { } } +export function maskWorkerLeaderboardDisplayName(value: unknown): string { + const firstCharacter = Array.from(String(value || '').trim())[0] + return firstCharacter ? `${firstCharacter}****` : '****' +} + export async function grabWorkerHallOrder(workOrderId: number | string, session: WorkerSession) { requireActiveWorkerSession(session) const worker = await getRequiredWorker(session.workerId)