Переглянути джерело

fix(admin): sort members by latest registration

彭峰 1 місяць тому
батько
коміт
be4f57eb88

+ 1 - 1
scripts/deploy-admin-functions.mjs

@@ -2660,7 +2660,7 @@ function fail(status, message) { const error = new Error(message); error.status
 function pointerId(value) { return value && (value.id || value.objectId || (value.__type === 'Pointer' && value.objectId)); }
 function number(value, fallback = 0) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : fallback; }
 function text(value) { return String(value == null ? '' : value).trim(); }
-function dateIso(value) { if (!value || Array.isArray(value)) return ''; const raw = value.iso || value; if (raw && typeof raw === 'object') return ''; const date = new Date(raw); return Number.isNaN(date.getTime()) ? '' : date.toISOString(); }
+function dateIso(value) { if (!value || Array.isArray(value)) return ''; if (value instanceof Date) return Number.isNaN(value.getTime()) ? '' : value.toISOString(); const raw = value.iso || value; if (raw instanceof Date) return Number.isNaN(raw.getTime()) ? '' : raw.toISOString(); if (raw && typeof raw === 'object') return ''; const date = new Date(raw); return Number.isNaN(date.getTime()) ? '' : date.toISOString(); }
 function firstDateIso(...values) { for (const value of values) { const iso=dateIso(value); if (iso) return iso; } return ''; }
 function legacyDateIso(value) { const raw=text(value); if(!raw) return ''; let normalized=raw; if(/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}(?:\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)?$/.test(raw)){const parts=raw.replaceAll('/','-').split(/\s+/);normalized=parts[0]+'T'+(parts[1]||'00:00:00')+'+08:00';} return dateIso(normalized); }
 function registeredAtOf(row) { const legacy=legacyOf(row); return legacyDateIso(legacy.RegTime)||dateIso(row.registeredAt)||dateIso(row.createdAt); }

+ 1 - 1
scripts/smoke-operations-functions.mjs

@@ -99,7 +99,7 @@ try {
 
   const denied = await call('xiaoshu/admin/gateway', token, { operation: 'catalog' }, 403);
   if (denied.success !== false) throw new Error('普通运营管理员仍可访问技术数据目录');
-  console.log(`Operations smoke passed: users=${users.total}, coaches=${coaches.total}, activeCoaches=${activeCoaches.total}, dashboardCoaches=${dashboardCoachMetric.value}, liveCoachAppointments=${coaches.liveSourceCount}, appointments=${schedule.totalAppointments}, latest=${latestSchedule.appointments.length}, identityConflicts=${identityConflicts.total}, conflictNames=${identityConflicts.items.map((item) => item.displayName).join('|') || 'none'}, metrics=${dashboard.metrics.length}, learning=${JSON.stringify(learningCounts)}.`);
+  console.log(`Operations smoke passed: users=${users.total}, newestMember=${users.items[0]?.displayName || 'none'}@${users.items[0]?.registeredAt || 'none'}, coaches=${coaches.total}, activeCoaches=${activeCoaches.total}, dashboardCoaches=${dashboardCoachMetric.value}, liveCoachAppointments=${coaches.liveSourceCount}, appointments=${schedule.totalAppointments}, latest=${latestSchedule.appointments.length}, identityConflicts=${identityConflicts.total}, conflictNames=${identityConflicts.items.map((item) => item.displayName).join('|') || 'none'}, metrics=${dashboard.metrics.length}, learning=${JSON.stringify(learningCounts)}.`);
 } finally {
   if (userId) {
     const sessions = await request(`${PARSE_URL}/classes/_Session?where=${encodeURIComponent(JSON.stringify({ user: { __type: 'Pointer', className: '_User', objectId: userId } }))}&limit=1000`, {}, true).catch(() => ({ results: [] }));