Complete ✅
作为 人才用户, 我想要 能够查看我的就业信息,包括当前就业状态、薪资记录和就业历史, 以便于 我能够了解和管理我的工作情况
[x] 任务1: 创建人才就业信息Schema (AC: 1, 2, 3)
talent-employment.schema.ts[x] 任务2: 扩展OrderService添加人才专用查询方法 (AC: 1, 2, 3, 4)
getCurrentEmploymentStatus(personId: number) 方法 - 获取当前就业状态getSalaryRecords(personId: number, month?: string) 方法 - 获取薪资记录getEmploymentHistory(personId: number) 方法 - 获取就业历史getSalaryVideos(personId: number, month?: string) 方法 - 获取薪资视频[x] 任务3: 创建人才就业信息API路由 (AC: 1, 2, 3, 4)
talent-employment.routes.ts/employment/status 接口 - 查询当前就业状态/employment/salary-records 接口 - 查询薪资记录/employment/history 接口 - 查询就业历史/employment/salary-videos 接口 - 查询薪资视频[x] 任务4: 使用talentAuthMiddleware认证中间件
[x] 任务5: 添加数据库查询性能优化 (AC: 6)
['personId', 'workStatus'], ['personId', 'joinDate', 'workStatus']['personId', 'assetType'], ['relatedTime'][x] 任务6: 在server包注册人才就业路由
talent-employment.routes.ts/api/v1/rencai 前缀[x] 任务7: 编写单元测试和集成测试 (AC: 5, 7)
[x] 任务8: 更新模块导出和文档
/api/v1/rencai 前缀,模块内路由不包含前缀 [Source: docs/prd/epic-015-talent-mini-program-api-support.md#L53-L61]OrderPerson实体关键字段 [Source: allin-packages/order-module/src/entities/order-person.entity.ts]:
id: op_id (主键)orderId: 订单ID (外键引用employment_order表)personId: 残疾人ID (外键)joinDate: 入职日期actualStartDate: 实际入职日期leaveDate: 离职日期workStatus: 工作状态 (枚举: not_working, pre_working, working, resigned)salaryDetail: 个人薪资 (decimal类型)order (多对一), person (多对一)EmploymentOrder实体关键字段 [Source: allin-packages/order-module/src/entities/employment-order.entity.ts]:
id: order_id (主键)orderName: 订单名称platformId: 用人平台IDcompanyId: 用人单位ID (外键)channelId: 渠道IDexpectedStartDate: 预计开始日期actualStartDate: 实际开始日期actualEndDate: 实际结束日期orderStatus: 订单状态 (枚举: draft, confirmed, in_progress, completed, cancelled)workStatus: 工作状态 (枚举: not_working, pre_working, working, resigned)createTime: 创建时间updateTime: 更新时间orderPersons (一对多)OrderPersonAsset实体关键字段 [Source: allin-packages/order-module/src/entities/order-person-asset.entity.ts]:
id: op_id (主键)orderId: 订单ID (外键)personId: 残疾人ID (外键)assetType: 资产类型 (枚举: tax, salary, job_result, contract_sign, disability_cert, other, salary_video, tax_video, checkin_video, work_video)assetFileType: 资产文件类型 (枚举: image, video)fileId: 文件ID (外键引用files表)status: 视频审核状态 (pending, verified, rejected)relatedTime: 关联时间order (多对一), file (多对一)Company实体关键字段 (参考company-module):
id: company_id (主键)companyName: 企业名称companyId: 企业ID (外键引用platform表)DisabledPerson实体关键字段 (参考disability-module):
id: person_id (主键)name: 姓名UserEntity关键字段 (参考故事015.002):
id: 用户ID (主键)username: 用户名userType: 用户类型 (admin/employer/talent)personId: 残疾人ID (外键,可为空) [Source: docs/stories/015.001.story.md#L132-L133]/api/v1/rencai [Source: docs/prd/epic-015-talent-mini-program-api-support.md#L53-L61]具体接口路径:
GET /api/v1/rencai/employment/statusGET /api/v1/rencai/employment/salary-recordsGET /api/v1/rencai/employment/historyGET /api/v1/rencai/employment/salary-videos模块位置:
allin-packages/order-module/ [Source: docs/architecture/source-tree.md]allin-packages/disability-module/ (参考人才个人信息API)packages/core-module/auth-module/ (认证中间件) [Source: docs/architecture/source-tree.md#L109-L129]packages/server/ (路由注册) [Source: docs/architecture/source-tree.md#L56-L61]order-module路由文件结构 (参考现有模式):
allin-packages/order-module/src/routes/
├── talent-employment.routes.ts # 新增: 人才就业路由
├── order-custom.routes.ts # 现有: 企业用户扩展路由
├── order-crud.routes.ts # 现有: CRUD路由
└── index.ts # 路由导出
order-module服务文件结构:
allin-packages/order-module/src/services/
├── order.service.ts # 现有服务,需要扩展
└── index.ts # 服务导出
order-module Schema文件结构:
allin-packages/order-module/src/schemas/
├── talent-employment.schema.ts # 新增: 人才就业Schema
├── order.schema.ts # 现有: 订单Schema
└── index.ts # Schema导出
当前就业状态响应Schema:
const EmploymentStatusResponseSchema = z.object({
companyName: z.string(), // 关联company表
orderId: z.number(),
orderName: z.string().nullable(),
positionName: z.string().nullable(), // 订单名称作为岗位名称
joinDate: z.string(), // ISO日期字符串 YYYY-MM-DD
workStatus: z.string(), // 枚举: not_working, pre_working, working, resigned
salaryLevel: z.number(), // 来自salaryDetail
actualStartDate: z.string().nullable(),
});
薪资记录响应Schema:
const SalaryRecordSchema = z.object({
orderId: z.number(),
orderName: z.string().nullable(),
companyName: z.string().nullable(), // 关联company表
salaryAmount: z.number(), // 来自salaryDetail
joinDate: z.string(), // ISO日期字符串 YYYY-MM-DD
month: z.string(), // 格式: YYYY-MM
});
const SalaryRecordsResponseSchema = z.object({
data: z.array(SalaryRecordSchema),
total: z.number(),
});
就业历史响应Schema:
const EmploymentHistoryItemSchema = z.object({
orderId: z.number(),
orderName: z.string().nullable(),
companyName: z.string().nullable(), // 关联company表
positionName: z.string().nullable(),
joinDate: z.string(), // ISO日期字符串 YYYY-MM-DD
leaveDate: z.string().nullable(), // ISO日期字符串 YYYY-MM-DD
workStatus: z.string(), // 枚举
salaryLevel: z.number(),
});
const EmploymentHistoryResponseSchema = z.object({
data: z.array(EmploymentHistoryItemSchema),
total: z.number(),
});
薪资视频响应Schema:
const SalaryVideoSchema = z.object({
id: z.number(),
assetType: z.string(), // salary_video 或 tax_video
assetFileType: z.string(), // video
fileUrl: z.string().nullable(), // 关联file表
fileName: z.string().nullable(),
status: z.string(), // pending, verified, rejected
relatedTime: z.string(), // ISO时间字符串
month: z.string(), // 格式: YYYY-MM (从relatedTime提取)
});
const SalaryVideosResponseSchema = z.object({
data: z.array(SalaryVideoSchema),
total: z.number(),
});
查询参数Schema:
const SalaryQuerySchema = z.object({
month: z.string().regex(/^\d{4}-\d{2}$/).optional(), // 格式: YYYY-MM
skip: z.coerce.number().int().min(0).default(0),
take: z.coerce.number().int().min(1).max(100).default(10),
});
const EmploymentHistoryQuerySchema = z.object({
skip: z.coerce.number().int().min(0).default(0),
take: z.coerce.number().int().min(1).max(100).default(20), // 就业历史可能较多,默认20条
});
当前就业状态查询逻辑:
薪资记录查询逻辑:
就业历史查询逻辑:
薪资视频查询逻辑:
使用talentAuthMiddleware:
talentAuthMiddleware [Source: docs/stories/015.002.story.md#L325]权限验证逻辑:
查询专用接口:
File模块集成 (参考现有模式):
packages/file-module/src/entities/file.entity.ts [Source: docs/architecture/source-tree.md#L130-L149]现有索引 (已在实体定义中):
['personId', 'workStatus'], ['personId', 'joinDate', 'workStatus'] [Source: allin-packages/order-module/src/entities/order-person.entity.ts#L7-L12]['personId', 'assetType'], ['relatedTime'] [Source: allin-packages/order-module/src/entities/order-person-asset.entity.ts#L7-L11]查询性能优化:
TypeORM关系配置 (参考现有模式):
@ManyToOne 关系: order, person [Source: allin-packages/order-module/src/entities/order-person.entity.ts#L82-L89]@OneToMany 关系: orderPersons [Source: allin-packages/order-module/src/entities/employment-order.entity.ts#L109-L110]@ManyToOne 关系: order, file [Source: allin-packages/order-module/src/entities/order-person-asset.entity.ts#L99-L112]relations 选项预加载关联数据talent-personal-info.routes.ts 的路由定义模式 [Source: allin-packages/disability-module/src/routes/talent-personal-info.routes.ts]talentAuthMiddleware [Source: docs/stories/015.002.story.md#L325]需要创建/修改的文件:
allin-packages/order-module/src/routes/talent-employment.routes.ts - 新增: 人才就业路由allin-packages/order-module/src/routes/index.ts - 修改: 导出新路由allin-packages/order-module/src/schemas/talent-employment.schema.ts - 新增: 人才就业Schemaallin-packages/order-module/src/schemas/index.ts - 修改: 导出新Schemaallin-packages/order-module/src/services/order.service.ts - 修改: 添加人才专用查询方法packages/server/src/index.ts - 修改: 注册人才就业路由 (添加/api/v1/rencai前缀)allin-packages/order-module/tests/integration/talent-employment.integration.test.ts - 新增: 集成测试@d8d/allin-order-module 包 [Source: docs/architecture/backend-module-package-standards.md#L39-L42]allin-packages/order-module/tests/integration/talent-employment.integration.test.ts [Source: docs/architecture/testing-strategy.md#L53]单元测试 (可选):
集成测试 (必须):
测试场景:
当前就业状态查询成功场景:
薪资记录查询成功场景:
就业历史查询成功场景:
薪资视频查询成功场景:
权限验证场景:
错误场景:
性能测试场景:
测试数据工厂 (参考现有模式):
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-25 | 1.0 | 初始故事创建 | Scrum Master |
此部分由开发代理在实施过程中填写
claude-sonnet
无
OpenAPI类型推断错误 (已修复 ✅):
talent-employment.routes.ts测试文件实体字段错误 (已修复 ✅):
talent-employment.integration.test.ts测试数据库环境问题 (已修复 ✅):
PostgreSQL兼容性问题 (已修复 ✅):
测试修复完成 (2025-12-28):
新增文件:
allin-packages/order-module/src/schemas/talent-employment.schema.ts - 人才就业信息Schema定义allin-packages/order-module/src/routes/talent-employment.routes.ts - 人才就业信息API路由allin-packages/order-module/tests/integration/talent-employment.integration.test.ts - 集成测试修改文件:
allin-packages/order-module/src/schemas/index.ts - 导出talent-employment.schemaallin-packages/order-module/src/services/order.service.ts - 添加人才专用查询方法allin-packages/order-module/src/routes/order.routes.ts - 导出talentEmploymentRoutesallin-packages/order-module/src/index.ts - 导出Schema和路由packages/server/src/index.ts - 注册人才就业路由到主应用此部分由QA代理在审查完成后填写