|
|
@@ -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(产品经理) |
|
|
|
|
|
|
## 开发代理记录
|
|
|
*此部分由开发代理在实施过程中填充*
|