Browse Source

fix(story-13.9): 修复代码审查发现的人才列表无限滚动问题

问题修复:
1. 修复 Sprint 状态不一致(13-9 从 review 更新为 done)
2. 修复 React 重复 key 警告(使用 personId + index 组合键)
3. 修复下拉刷新状态管理(添加错误处理,减少超时时间)
4. 修复空状态 totalCount 访问风险(使用可选链和空值合并)
5. 移除未使用的常量 _ENUM_TO_CHINESE_STATUS

Co-Authored-By: Claude <noreply@anthropic.com>
yourname 2 days ago
parent
commit
2b6a7943

+ 1 - 1
_bmad-output/implementation-artifacts/sprint-status.yaml

@@ -218,7 +218,7 @@ development_status:
   13-6-dashboard-sync: done       # 首页看板数据联动专项测试 ✅ 完成 (2026-01-14) - 所有4个测试通过
   13-7-dashboard-navigation: done   # 首页导航和交互测试 - 测试快捷操作按钮、查看全部链接、人才卡片点击 ✅ 完成 (2026-01-15) - 13/13 测试通过,所有代码审查问题已修复
   13-8-order-list-validation: in-progress   # 订单列表页完整验证(2026-01-14 新增)- 验证订单列表页所有功能:筛选、搜索、分页、字段显示、交互
-  13-9-talent-list-validation: review       # 人才列表页完整验证(2026-01-14 新增)- 验证人才列表页所有功能:筛选、搜索、分页、字段显示、交互 ✅ 完成 (2026-01-14) - 已实现所有 AC 测试
+  13-9-talent-list-validation: done         # 人才列表页完整验证(2026-01-14 新增)- 验证人才列表页所有功能:筛选、搜索、分页、字段显示、交互 ✅ 完成 (2026-01-14) - 已实现所有 AC 测试
   13-10-talent-detail-validation: review   # 人才详情页完整性验证 ✅ 完成 (2026-01-14) - 已添加 Page Object 方法和 E2E 测试   # 人才详情页完整性验证(2026-01-14 新增)
   13-11-order-detail-validation: review   # 订单详情页完整性验证 ✅ 完成 (2026-01-14) - 已添加 Page Object 方法和 E2E 测试,被 Story 13.7 的已知模块导入问题阻塞
   13-12-statistics-page-validation: done   # 数据统计页测试与功能修复(2026-01-15 完成)- Page Object 已实现,E2E 测试已创建(25 个测试用例)

+ 8 - 13
mini-ui-packages/yongren-talent-management-ui/src/pages/TalentManagement/TalentManagement.tsx

@@ -40,15 +40,6 @@ const CHINESE_STATUS_TO_ENUM: Record<string, WorkStatus> = {
   '未就业': WorkStatus.NOT_WORKING
 }
 
-// WorkStatus枚举到中文状态的映射
-const _ENUM_TO_CHINESE_STATUS: Record<WorkStatus, string> = {
-  [WorkStatus.WORKING]: '在职',
-  [WorkStatus.PRE_WORKING]: '待入职',
-  [WorkStatus.RESIGNED]: '离职',
-  [WorkStatus.NOT_WORKING]: '未就业'
-}
-
-
 const TalentManagement: React.FC<TalentManagementProps> = () => {
   const { user: _user } = useAuth()
   const { isLoggedIn } = useRequireAuth()
@@ -121,15 +112,19 @@ const TalentManagement: React.FC<TalentManagementProps> = () => {
 
   // 合并所有分页数据
   const allTalents = data?.pages.flatMap(page => page.data) || []
-  const totalCount = data?.pages[0]?.total || 0
+  // 安全访问 totalCount,处理 pages 为空的情况
+  const totalCount = data?.pages?.[0]?.total ?? 0
 
   // 下拉刷新
   const onRefresh = async () => {
     setRefreshing(true)
     try {
       await refetch()
+    } catch (error) {
+      console.error('刷新失败:', error)
     } finally {
-      setTimeout(() => setRefreshing(false), 500)
+      // 等待一小段时间确保用户看到刷新动画
+      setTimeout(() => setRefreshing(false), 300)
     }
   }
 
@@ -322,9 +317,9 @@ const TalentManagement: React.FC<TalentManagementProps> = () => {
             ) : allTalents.length > 0 ? (
               // 人才列表
               <View className="space-y-3">
-                {allTalents.map((talent) => (
+                {allTalents.map((talent, index) => (
                   <View
-                    key={talent.personId}
+                    key={`${talent.personId}-${index}`}
                     className="card bg-white p-4 flex items-center cursor-pointer active:bg-gray-50"
                     onClick={() => handleTalentClick(talent.personId)}
                   >