Explorar el Código

docs(story): 更新故事011.003文档并标记为Ready for Development

- 根据故事011.001和011.002完成情况全面更新依赖关系
- 添加具体API规范,包含客户端信息、路径前缀和使用示例
- 更新组件规范,添加基础组件集成说明和页面结构模板
- 明确文件位置,区分已实现基础组件和需要创建的页面组件
- 将故事状态从Draft更新为Ready for Development

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname hace 1 mes
padre
commit
073097dc8e
Se han modificado 1 ficheros con 226 adiciones y 28 borrados
  1. 226 28
      docs/stories/011.003.story.md

+ 226 - 28
docs/stories/011.003.story.md

@@ -1,7 +1,7 @@
 # 故事 011.003:人才管理功能实现
 
 ## 状态
-Draft
+Ready for Development
 
 ## 故事
 **作为**企业用户,
@@ -56,34 +56,185 @@ Draft
 
 ### 依赖关系
 **依赖故事**:
-- 011.001(基础框架搭建):提供API客户端、路由、基础布局
-- 011.002(认证与首页):提供认证状态管理
-- 需要登录后才能访问人才管理功能
+- ✅ **011.001(基础框架搭建)**:已完成,提供以下已就绪的基础设施:
+  - **API客户端**:所有allin系统模块和企业专用API客户端已集成到`mini/src/api.ts`:
+    - `disabilityClient` - 残疾人才API(路径前缀:`/api/v1/disability`)
+    - `orderClient` - 订单管理API(路径前缀:`/api/v1/order`)
+    - `salaryClient` - 薪资管理API(路径前缀:`/api/v1/salary`)
+    - `enterpriseCompanyClient` - 企业统计API(路径前缀:`/api/v1/yongren/company`)
+    - `fileClient` - 文件管理API(路径前缀:`/api/v1/file`)
+  - **路由配置**:用人方小程序8个页面路由已配置,人才管理页面路由位置:`pages/yongren/talent/list` 和 `pages/yongren/talent/detail`
+  - **基础布局组件**:`YongrenTabBarLayout`(底部导航布局)、`UserStatusBar`(用户状态栏)、`PageContainer`(页面容器)
+  - **企业用户认证框架**:`EnterpriseAuthProvider`(认证上下文)、`useEnterpriseAuth`钩子(登录状态管理)
+- ✅ **011.002(认证与首页实现)**:已完成,提供以下已就绪的功能:
+  - **登录页面**:企业用户手机号密码登录页面已实现(`mini/src/pages/login/index.tsx`),UI严格对照原型设计
+  - **认证状态管理**:包含自动token刷新机制、登录状态检查中间件(`useRequireAuth`钩子)
+  - **首页集成**:人才管理页面需要使用`YongrenTabBarLayout`布局组件,人才标签激活状态
+  - **集成测试框架**:API测试基础已扩展,可复用现有测试模式
+- **访问控制**:人才管理功能需要用户登录后才能访问,可使用`useRequireAuth`钩子进行权限保护
 
 ### API规范
 **残疾人才API**(disability_person模块):
-- 人才列表查询接口(支持搜索、筛选、分页)
-- 人才详情查询接口
-- 人才统计接口
+- **客户端**:`disabilityClient`(已在`mini/src/api.ts`中可用,由故事011.001集成)
+- **路径前缀**:`/api/v1/disability`
+- **主要接口**:
+  - `GET /` - 人才列表查询接口(支持搜索、筛选、分页)
+    - 查询参数:`search?`(姓名、残疾证号)、`status?`(工作状态)、`disability_type?`(残疾类型)、`page?`、`limit?`
+  - `GET /{id}` - 人才详情查询接口
+  - `GET /stats` - 人才统计接口
+- **使用示例**:
+  ```typescript
+  import { disabilityClient } from '@/api'
+
+  // 获取人才列表(带搜索和筛选)
+  const talentList = await disabilityClient.get({
+    query: {
+      search: '张明',
+      status: '在职',
+      disability_type: '肢体残疾',
+      page: 1,
+      limit: 20
+    }
+  })
+
+  // 获取人才详情
+  const talentDetail = await disabilityClient['{id}'].get({
+    param: { id: '123' }
+  })
+  ```
 
 **订单管理API**(order模块):
-- 人才工作信息查询接口
-- 订单历史查询接口
+- **客户端**:`orderClient`(已在`mini/src/api.ts`中可用,由故事011.001集成)
+- **路径前缀**:`/api/v1/order`
+- **主要接口**:
+  - `GET /person/{person_id}` - 人才工作信息查询接口(获取指定人才的相关订单信息)
+  - `GET /history` - 订单历史查询接口(支持按人才ID筛选)
+- **使用示例**:
+  ```typescript
+  import { orderClient } from '@/api'
+
+  // 获取人才工作信息
+  const workInfo = await orderClient.person['{person_id}'].get({
+    param: { person_id: '123' }
+  })
+
+  // 获取订单历史
+  const orderHistory = await orderClient.history.get({
+    query: { person_id: '123', page: 1, limit: 10 }
+  })
+  ```
 
 **薪资管理API**(salary模块):
-- 薪资记录查询接口
-- 薪资历史接口
+- **客户端**:`salaryClient`(已在`mini/src/api.ts`中可用,由故事011.001集成)
+- **路径前缀**:`/api/v1/salary`
+- **主要接口**:
+  - `GET /person/{person_id}` - 薪资记录查询接口(获取指定人才的薪资记录)
+  - `GET /history/{person_id}` - 薪资历史接口(获取指定人才的薪资历史,支持时间范围筛选)
+- **使用示例**:
+  ```typescript
+  import { salaryClient } from '@/api'
+
+  // 获取人才薪资记录
+  const salaryRecords = await salaryClient.person['{person_id}'].get({
+    param: { person_id: '123' }
+  })
+
+  // 获取薪资历史
+  const salaryHistory = await salaryClient.history['{person_id}'].get({
+    param: { person_id: '123' },
+    query: { start_date: '2024-01-01', end_date: '2024-12-31' }
+  })
+  ```
 
 **文件管理API**(file模块):
-- 文件列表查询接口
-- 文件下载接口
-- 文件预览接口
+- **客户端**:`fileClient`(已在`mini/src/api.ts`中可用,由故事011.001集成)
+- **路径前缀**:`/api/v1/file`
+- **主要接口**:
+  - `GET /list` - 文件列表查询接口(支持按关联类型和关联ID筛选)
+    - 查询参数:`relation_type`(如'disabled_person')、`relation_id`(人才ID)
+  - `GET /download/{id}` - 文件下载接口
+  - `GET /preview/{id}` - 文件预览接口(返回预览URL)
+- **使用示例**:
+  ```typescript
+  import { fileClient } from '@/api'
+
+  // 获取人才相关文件列表
+  const fileList = await fileClient.list.get({
+    query: {
+      relation_type: 'disabled_person',
+      relation_id: '123'
+    }
+  })
+
+  // 下载文件
+  const downloadUrl = fileClient.download['{id}'].getUrl({ param: { id: 'file_456' } })
+  ```
+
+**企业统计API**(企业扩展):
+- **客户端**:`enterpriseCompanyClient`(已在`mini/src/api.ts`中可用,由故事011.001集成)
+- **路径前缀**:`/api/v1/yongren/company`
+- **相关接口**:
+  - `GET /allocations/recent` - 近期分配人才列表(可用于人才列表的"分配人才"筛选)
+- **使用示例**:
+  ```typescript
+  import { enterpriseCompanyClient } from '@/api'
+
+  // 获取近期分配人才列表
+  const recentAllocations = await enterpriseCompanyClient.allocations.recent.get()
+  ```
 
 **技术集成**:
-- 使用故事011.001集成的RPC客户端
-- API路径前缀:`api/v1/yongren`
+- **RPC客户端**:使用故事011.001已集成的RPC客户端,遵循Hono RPC客户端模式
+- **认证集成**:所有API调用自动携带企业用户token(通过企业认证框架管理)
+- **错误处理**:使用企业认证框架的错误处理机制,处理401、403等认证错误
+- **类型安全**:所有客户端已包含完整的TypeScript类型定义
 
 ### 组件规范
+**基础组件集成**(由故事011.001提供):
+人才管理页面必须与故事011.001已实现的基础框架无缝集成:
+
+1. **布局组件**:
+   - `YongrenTabBarLayout` - 底部导航布局组件,人才管理页面需要使用此布局,并确保"人才"标签处于激活状态
+   - `PageContainer` - 页面容器组件,提供统一的页面内边距和滚动容器
+   - `UserStatusBar` - 用户状态栏组件,显示当前用户信息和通知状态(可选使用)
+
+2. **页面结构模板**:
+   ```tsx
+   // 人才列表页基本结构示例
+   import { YongrenTabBarLayout } from '@/layouts/yongren-tab-bar-layout'
+   import { PageContainer } from '@/components/ui/page-container'
+
+   export default function TalentListPage() {
+     return (
+       <YongrenTabBarLayout activeTab="talent">
+         <PageContainer>
+           {/* 页面具体内容 */}
+         </PageContainer>
+       </YongrenTabBarLayout>
+     )
+   }
+   ```
+
+3. **认证集成**:
+   - 使用`useRequireAuth`钩子(由故事011.002提供)保护页面,未登录用户自动重定向到登录页
+   - 使用`useEnterpriseAuth`钩子(由故事011.001提供)获取当前企业用户信息
+   - 示例:
+   ```tsx
+   import { useRequireAuth } from '@/hooks/useRequireAuth'
+
+   export default function TalentListPage() {
+     // 未登录用户会自动重定向到登录页
+     useRequireAuth()
+
+     // 页面具体实现...
+   }
+   ```
+
+4. **样式规范**:
+   - 遵循故事011.001定义的基础样式规范(颜色系统、卡片阴影、圆角等)
+   - 使用Tailwind CSS工具类,确保移动端响应式设计
+   - 严格对照原型文件 `docs/小程序原型/yongren.html` 实现UI细节
+
 **人才列表页设计规范**:
 必须严格对照原型文件 `docs/小程序原型/yongren.html` 第419-560行的人才列表页面设计实现:
 
@@ -172,21 +323,62 @@ Draft
 - 集成文件管理API
 
 **UI组件使用**:
-- **独立开发小程序UI组件**:基于原型文件独立设计开发人才管理相关UI组件
-- **复用现有基础组件**:复用mini项目中已有的基础UI组件(表格、表单、卡片等),根据原型设计调整样式
+- **复用故事011.001已实现的基础组件**:
+  - `YongrenTabBarLayout` - 底部导航布局组件(必须使用,人才标签激活状态)
+  - `PageContainer` - 页面容器组件(提供统一的内边距和滚动容器)
+  - `UserStatusBar` - 用户状态栏组件(可选,用于显示用户信息和通知)
+  - 基础卡片样式:遵循故事011.001定义的`.card`样式规范(圆角12px,阴影等)
+- **独立开发人才管理业务组件**:基于原型文件独立设计开发人才管理相关UI组件
+  - 人才搜索组件:集成到列表页搜索区域
+  - 人才筛选组件:支持工作状态、残疾类型等多维度筛选
+  - 人才表格/卡片组件:展示人才列表信息
+  - 人才详情组件:展示完整人才信息
+  - 薪资历史组件:展示薪资变化趋势
+  - 文件管理组件:展示个人征信文件
+- **复用现有基础UI组件**:复用mini项目中已有的基础UI组件(表单输入框、按钮、加载指示器等),根据原型设计调整样式
+- **样式规范**:
+  - 严格遵循故事011.001定义的颜色系统、卡片阴影、圆角等设计规范
+  - 使用Tailwind CSS工具类,确保移动端响应式设计
+  - 所有人才管理页面必须严格对照原型文件 `docs/小程序原型/yongren.html` 实现UI细节
 - **注意**:史诗011针对mini小程序,UI组件应独立设计,而非复用管理后台的`@d8d/allin-*`系列UI包
 
 ### 文件位置
-**页面组件位置**:
-- `mini/src/pages/yongren/talent/list/` - 人才列表页面
-- `mini/src/pages/yongren/talent/detail/` - 人才详情页面
-
-**业务组件位置**:
-- `mini/src/components/talent/` - 人才相关业务组件
-  - `TalentSearch.tsx` - 搜索组件
-  - `TalentFilter.tsx` - 筛选组件
-  - `TalentTable.tsx` - 表格组件
-  - `SalaryHistory.tsx` - 薪资历史组件
+**基础组件位置**(已由故事011.001实现):
+- **布局组件**:
+  - `mini/src/layouts/yongren-tab-bar-layout.tsx` - `YongrenTabBarLayout`组件(底部导航布局)
+  - `mini/src/components/ui/page-container.tsx` - `PageContainer`组件(页面容器)
+  - `mini/src/components/ui/user-status-bar.tsx` - `UserStatusBar`组件(用户状态栏,可选)
+- **认证框架**:
+  - `mini/src/utils/auth.tsx` - `EnterpriseAuthProvider`和`useEnterpriseAuth`钩子(企业认证上下文)
+  - `mini/src/hooks/useRequireAuth.ts` - `useRequireAuth`钩子(页面访问权限检查,由故事011.002添加)
+- **API客户端**:
+  - `mini/src/api.ts` - 所有API客户端主文件(包含`disabilityClient`、`orderClient`、`salaryClient`、`fileClient`等)
+- **路由配置**:
+  - `mini/src/app.config.ts` - 小程序路由配置文件(已包含人才管理页面路由占位符)
+
+**页面组件位置**(需要创建):
+- `mini/src/pages/yongren/talent/list/index.tsx` - 人才列表页面组件
+  - 应使用`YongrenTabBarLayout`布局,`activeTab="talent"`
+  - 应使用`PageContainer`作为内容容器
+  - 路由路径:`pages/yongren/talent/list`
+- `mini/src/pages/yongren/talent/detail/index.tsx` - 人才详情页面组件
+  - 应使用`YongrenTabBarLayout`布局,`activeTab="talent"`
+  - 应使用`PageContainer`作为内容容器
+  - 路由路径:`pages/yongren/talent/detail`
+
+**业务组件位置**(需要创建):
+- `mini/src/components/talent/` - 人才管理相关业务组件目录
+  - `TalentSearch.tsx` - 人才搜索组件(集成到列表页搜索区域)
+  - `TalentFilter.tsx` - 人才筛选组件(支持工作状态、残疾类型等多维度筛选)
+  - `TalentTable.tsx` - 人才表格组件(或`TalentCard.tsx`卡片组件)
+  - `TalentDetailInfo.tsx` - 人才详情信息组件(展示基本信息、工作信息、薪资信息等)
+  - `SalaryHistory.tsx` - 薪资历史组件(展示薪资变化趋势和图表)
+  - `CreditFileList.tsx` - 个人征信文件列表组件(展示、预览、下载文件)
+
+**测试文件位置**(需要创建):
+- `mini/tests/yongren-talent-list.test.tsx` - 人才列表页测试
+- `mini/tests/yongren-talent-detail.test.tsx` - 人才详情页测试
+- `mini/tests/yongren-talent-api.test.ts` - 人才管理API集成测试(可扩展现有`yongren-api.test.ts`)
 
 ### 数据模型
 基于史诗012扩展的数据库schema:
@@ -221,6 +413,12 @@ Draft
 | 日期 | 版本 | 描述 | 作者 |
 |------|------|------|------|
 | 2025-12-17 | 1.0 | 初始创建(人才管理故事) | Bob(Scrum Master) |
+| 2025-12-18 | 1.1 | 根据故事011.001和011.002完成情况更新文档 | John(产品经理) |
+| 2025-12-18 | 1.2 | 更新依赖关系:详细列出已完成的011.001和011.002提供的功能 | John(产品经理) |
+| 2025-12-18 | 1.3 | 更新API规范:添加具体客户端信息、路径前缀和使用示例 | John(产品经理) |
+| 2025-12-18 | 1.4 | 更新组件规范:添加基础组件集成说明和页面结构模板 | John(产品经理) |
+| 2025-12-18 | 1.5 | 更新文件位置:区分已实现的基础组件和需要创建的页面组件 | John(产品经理) |
+| 2025-12-18 | 1.6 | 更新状态:从Draft改为Ready for Development | John(产品经理) |
 
 ## 开发代理记录
 *此部分由开发代理在实施过程中填充*