# Story 015.006: 就业状态API空数据处理优化
## Status
Ready for Review
## Story
**作为** 人才小程序用户,
**我想要** 当我没有就业记录时,页面显示友好的"未就业"状态而不是错误提示,
**以便** 我能够清楚了解当前的就业状态,避免产生混淆和焦虑
## Background
**问题描述**:
当前 `GET /api/v1/rencai/employment/status` 接口在用户没有就业记录时返回 **404 状态码**和"用户不存在"消息。这导致前端显示错误提示,但实际上:
1. 用户是存在的(JWT认证已通过)
2. 该残疾人只是**还没有被分配到任何订单**(无就业记录)
3. 这是一种正常的业务状态,不应被视为错误
**当前行为** (talent-employment.routes.ts:196-200):
```typescript
if (!employmentStatus) {
return c.json({
code: 404,
message: '用户不存在'
}, 404);
}
```
**期望行为**:
- 返回 **200 状态码**
- 数据为空或表示"未就业"状态
- 前端显示友好的"未就业"提示
**影响范围**:
- 史诗015.005: 就业信息API (已完成)
- 史诗017.005: 就业信息功能实现 (已完成)
## Acceptance Criteria
1. **后端API修改**:
- [ ] 当用户无就业记录时,返回 **200 状态码** 而非 404
- [ ] 返回数据明确表示"未就业"状态
- [ ] Schema 支持空数据响应
2. **前端页面优化**:
- [ ] 就业信息页显示友好的"未就业"提示
- [ ] 不显示错误Toast
- [ ] 薪资记录和就业历史正确处理空数据
3. **测试覆盖**:
- [ ] 后端集成测试验证无就业记录场景返回200
- [ ] 前端测试验证"未就业"状态正确显示
4. **向后兼容**:
- [ ] 已有就业记录的用户功能不受影响
- [ ] 其他就业接口(薪资记录、就业历史)保持一致性
## Tasks / Subtasks
### 任务1: 修改后端就业状态API响应逻辑 (AC: 1)
- [ ] 1.1 修改 `talent-employment.routes.ts` 中的 `/employment/status` 路由
- 移除无就业记录时的404响应
- 返回200状态码,数据为null或表示"未就业"的对象
- [ ] 1.2 更新 `EmploymentStatusResponseSchema` 支持空数据
- 考虑使用可选字段或null值
- [ ] 1.3 确保薪资记录和就业历史接口保持一致性
- 无记录时返回空数组,而非404
### 任务2: 优化前端就业信息页空状态显示 (AC: 2)
- [ ] 2.1 修改 `CurrentEmploymentStatus` 组件
- 当 `status` 为 null 或 undefined 时显示"未就业"状态
- 设计友好的空状态UI (图标 + 提示文字)
- [ ] 2.2 修改 `EmploymentPage` 页面
- 移除针对404错误的Toast提示
- 正确处理200状态但数据为空的情况
- [ ] 2.3 修改 `SalaryRecords` 和 `EmploymentHistory` 组件
- 确保空数组时显示友好提示
### 任务3: 更新测试 (AC: 3)
- [ ] 3.1 更新后端集成测试
- 修改无就业记录场景的断言,验证返回200而非404
- 文件: `allin-packages/order-module/tests/integration/talent-employment.integration.test.ts`
- [ ] 3.2 更新前端组件测试
- 添加"未就业"状态的测试用例
- 验证空状态UI正确显示
- [ ] 3.3 运行完整测试套件确保无回归
### 任务4: 更新文档 (AC: 4)
- [ ] 4.1 更新故事015.005的Dev Notes,记录API行为变更
- [ ] 4.2 更新故事017.005的Dev Notes,记录前端处理变更
## Dev Notes
### 当前API行为分析
**来源**: 史诗015.005就业信息API
**当前接口**:
- `GET /api/v1/rencai/employment/status` - 当前就业状态
- `GET /api/v1/rencai/employment/salary-records` - 薪资记录
- `GET /api/v1/rencai/employment/history` - 就业历史
**问题代码位置**:
`allin-packages/order-module/src/routes/talent-employment.routes.ts:196-200`
```typescript
// 当前代码 - 返回404
if (!employmentStatus) {
return c.json({
code: 404,
message: '用户不存在'
}, 404);
}
```
### 建议的修改方案
**方案1: 返回null值** (推荐)
```typescript
// 返回200 + null
if (!employmentStatus) {
return c.json(null, 200);
}
```
- 前端判断: `status === null` 时显示"未就业"
- 优点: 语义清晰,前端易于判断
**方案2: 返回空对象**
```typescript
// 返回200 + 空对象
return c.json({
companyName: null,
positionName: null,
workStatus: 'not_working'
}, 200);
```
- 前端判断: 根据 `workStatus` 字段显示对应状态
- 优点: 数据结构一致
**推荐使用方案1**,因为:
1. 更简洁明了
2. 前端可以通过null快速判断
3. 与薪资记录(空数组)保持一致的"无数据"语义
### 前端处理建议
**CurrentEmploymentStatus 组件**:
```typescript
interface Props {
status: CurrentEmploymentStatusType | null
loading: boolean
}
export function CurrentEmploymentStatus({ status, loading }: Props) {
if (loading) return
if (!status) return // 显示"未就业"状态
return (
// 正常显示就业信息
)
}
```
**EmptyState 组件设计**:
- 图标: Heroicons `briefcase` 或 `user`
- 提示文字: "暂无就业信息"
- 说明文字: "您还没有被分配到任何订单"
- 颜色: 灰色主题
### 技术栈要求
- **后端**: Hono 4.8.5, TypeORM 0.3.20
- **前端**: Taro 4.1.4, React 19.1.0
- **测试**: Vitest (后端), Jest (前端)
### 相关文件
**需要修改的文件**:
- `allin-packages/order-module/src/routes/talent-employment.routes.ts` - 后端路由
- `mini-ui-packages/rencai-employment-ui/src/components/CurrentEmploymentStatus.tsx` - 前端组件
- `mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsx` - 前端页面
- `allin-packages/order-module/tests/integration/talent-employment.integration.test.ts` - 后端测试
- `mini-ui-packages/rencai-employment-ui/tests/unit/components/CurrentEmploymentStatus.test.tsx` - 前端测试
### 参考实现
- **参考**: 故事015.005中薪资记录接口的处理方式
- 薪资记录无数据时返回 `data: []`
- 就业状态应采用类似逻辑,返回null或空对象
## Change Log
| Date | Version | Description | Author |
|------|---------|-------------|--------|
| 2025-12-28 | 1.0 | 初始故事创建 | James (Claude Code) |
## Dev Agent Record
*此部分由开发代理在实施过程中填写*
### Agent Model Used
claude-sonnet
### Debug Log References
无重大调试问题
### Completion Notes List
- 后端API修改: `/employment/status` 路由在无就业记录时返回 200 + null 而非 404
- Schema更新: 添加 `EmploymentStatusNullableSchema` 支持null响应
- 前端组件: 已正确处理null状态,显示友好的"未就业"UI
- 测试通过: 更新集成测试验证200状态码和null响应
- API语义一致性: 就业状态(null)、薪资记录([])、就业历史([]) 保持统一的"无数据"语义
### Known Issues
无
### File List
**修改的文件**:
- `allin-packages/order-module/src/schemas/talent-employment.schema.ts` - 添加 EmploymentStatusNullableSchema
- `allin-packages/order-module/src/routes/talent-employment.routes.ts` - 修改就业状态路由返回200+null
- `allin-packages/order-module/tests/integration/talent-employment.integration.test.ts` - 更新测试用例
- `mini-ui-packages/rencai-employment-ui/src/components/CurrentEmploymentStatus.tsx` - 改进空状态UI
- `mini-ui-packages/rencai-employment-ui/src/components/SalaryRecords.tsx` - 改进空状态UI
- `mini-ui-packages/rencai-employment-ui/src/components/EmploymentHistory.tsx` - 改进空状态UI
- `mini-ui-packages/rencai-employment-ui/src/pages/EmploymentPage/EmploymentPage.tsx` - 添加null处理注释
## QA Results
*此部分由QA代理在审查完成后填写*