2
0
Эх сурвалжийг харах

fix(epic012): 修复故事012.003测试配置问题

- 修复公司模块缺少依赖问题:添加@d8d/allin-disability-module和@d8d/bank-names-module依赖
- 修复测试缺少实体配置问题:添加BankName、DisabledPhoto、DisabledRemark、DisabledVisit实体导入
- 修复测试数据字段缺失问题:添加phone、province、city必填字段
- 修复gender字段类型问题:将数字类型改为字符串'男'/'女'
- 修复路由路径问题:调整路由路径与API约定一致
- 修复外键约束错误:创建实际的BankName记录
- 更新故事012.003状态为"Completed ✅ (代码实现和测试配置完成)"

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

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 1 долоо хоног өмнө
parent
commit
40f65d6525

+ 2 - 0
allin-packages/company-module/package.json

@@ -54,6 +54,8 @@
     "@d8d/user-module": "workspace:*",
     "@d8d/user-module": "workspace:*",
     "@d8d/file-module": "workspace:*",
     "@d8d/file-module": "workspace:*",
     "@d8d/allin-order-module": "workspace:*",
     "@d8d/allin-order-module": "workspace:*",
+    "@d8d/allin-disability-module": "workspace:*",
+    "@d8d/bank-names-module": "workspace:*",
     "@d8d/allin-enums": "workspace:*",
     "@d8d/allin-enums": "workspace:*",
     "@hono/zod-openapi": "^1.0.2",
     "@hono/zod-openapi": "^1.0.2",
     "typeorm": "^0.3.20",
     "typeorm": "^0.3.20",

+ 4 - 2
allin-packages/company-module/src/routes/company-statistics.route.ts

@@ -14,8 +14,9 @@ type EnterpriseUser = z.infer<typeof EnterpriseUserResponseSchema>;
  */
  */
 const companyOverviewRoute = createRoute({
 const companyOverviewRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/overview',
+  path: '/company/overview',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
+  operationId: 'getCompanyOverview',
   responses: {
   responses: {
     200: {
     200: {
       description: '获取企业概览统计成功',
       description: '获取企业概览统计成功',
@@ -51,8 +52,9 @@ const companyOverviewRoute = createRoute({
  */
  */
 const companyTalentsRoute = createRoute({
 const companyTalentsRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/{id}/talents',
+  path: '/company/{id}/talents',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
+  operationId: 'getCompanyTalents',
   request: {
   request: {
     params: z.object({
     params: z.object({
       id: z.coerce.number().int().positive().openapi({
       id: z.coerce.number().int().positive().openapi({

+ 19 - 7
allin-packages/company-module/tests/integration/company-statistics.integration.test.ts

@@ -6,14 +6,15 @@ import { UserEntity, Role } from '@d8d/user-module';
 import { File } from '@d8d/file-module';
 import { File } from '@d8d/file-module';
 import { Platform } from '@d8d/allin-platform-module/entities';
 import { Platform } from '@d8d/allin-platform-module/entities';
 import { EmploymentOrder, OrderPerson } from '@d8d/allin-order-module/entities';
 import { EmploymentOrder, OrderPerson } from '@d8d/allin-order-module/entities';
-import { DisabledPerson } from '@d8d/allin-disability-module/entities';
+import { DisabledPerson, DisabledBankCard, DisabledPhoto, DisabledRemark, DisabledVisit } from '@d8d/allin-disability-module/entities';
+import { BankName } from '@d8d/bank-names-module';
 import companyStatisticsRoutes from '../../src/routes/company-statistics.route';
 import companyStatisticsRoutes from '../../src/routes/company-statistics.route';
 import { Company } from '../../src/entities/company.entity';
 import { Company } from '../../src/entities/company.entity';
 
 
 // 设置集成测试钩子 - 需要包含所有相关实体
 // 设置集成测试钩子 - 需要包含所有相关实体
 setupIntegrationDatabaseHooksWithEntities([
 setupIntegrationDatabaseHooksWithEntities([
   UserEntity, File, Role, Platform, Company,
   UserEntity, File, Role, Platform, Company,
-  EmploymentOrder, OrderPerson, DisabledPerson
+  EmploymentOrder, OrderPerson, DisabledPerson, BankName, DisabledBankCard, DisabledPhoto, DisabledRemark, DisabledVisit
 ])
 ])
 
 
 describe('企业统计API集成测试', () => {
 describe('企业统计API集成测试', () => {
@@ -85,10 +86,15 @@ describe('企业统计API集成测试', () => {
       const disabledPerson = disabledPersonRepo.create({
       const disabledPerson = disabledPersonRepo.create({
         name: '测试残疾人',
         name: '测试残疾人',
         idCard: `110101${Date.now() % 100000000}`,
         idCard: `110101${Date.now() % 100000000}`,
-        gender: 1,
+        gender: '男',
         birthDate: new Date('1990-01-01'),
         birthDate: new Date('1990-01-01'),
         disabilityType: '视力残疾',
         disabilityType: '视力残疾',
         disabilityLevel: '一级',
         disabilityLevel: '一级',
+        disabilityId: `DIS${Date.now() % 100000000}`,
+        idAddress: '身份证地址',
+        phone: '13800138000',
+        province: '北京市',
+        city: '北京市',
         address: '测试地址'
         address: '测试地址'
       });
       });
       await disabledPersonRepo.save(disabledPerson);
       await disabledPersonRepo.save(disabledPerson);
@@ -127,13 +133,13 @@ describe('企业统计API集成测试', () => {
 
 
       // 验证响应结构
       // 验证响应结构
       expect(data).toHaveProperty('在职人员数');
       expect(data).toHaveProperty('在职人员数');
-      expect(data).toHaveProperty('订单数');
+      expect(data).toHaveProperty('进行中订单数');
       expect(data).toHaveProperty('累计用工时长');
       expect(data).toHaveProperty('累计用工时长');
       expect(data).toHaveProperty('平均薪资');
       expect(data).toHaveProperty('平均薪资');
 
 
       // 验证数据
       // 验证数据
       expect(data.在职人员数).toBe(1);
       expect(data.在职人员数).toBe(1);
-      expect(data.订单数).toBe(1);
+      expect(data.进行中订单数).toBe(1);
     });
     });
 
 
     it('未认证用户应该返回401', async () => {
     it('未认证用户应该返回401', async () => {
@@ -182,10 +188,15 @@ describe('企业统计API集成测试', () => {
         const person = disabledPersonRepo.create({
         const person = disabledPersonRepo.create({
           name: `测试残疾人${i}`,
           name: `测试残疾人${i}`,
           idCard: `110101${Date.now() % 100000000 + i}`,
           idCard: `110101${Date.now() % 100000000 + i}`,
-          gender: i % 2 + 1,
+          gender: i % 2 === 0 ? '男' : '女',
           birthDate: new Date('1990-01-01'),
           birthDate: new Date('1990-01-01'),
           disabilityType: '视力残疾',
           disabilityType: '视力残疾',
           disabilityLevel: '一级',
           disabilityLevel: '一级',
+          disabilityId: `DIS${Date.now() % 100000000 + i}`,
+          idAddress: '身份证地址',
+          phone: `1380013800${i}`,
+          province: '北京市',
+          city: '北京市',
           address: '测试地址'
           address: '测试地址'
         });
         });
         await disabledPersonRepo.save(person);
         await disabledPersonRepo.save(person);
@@ -205,7 +216,8 @@ describe('企业统计API集成测试', () => {
 
 
       // 创建订单人员关联
       // 创建订单人员关联
       const orderPersonRepo = dataSource.getRepository(OrderPerson);
       const orderPersonRepo = dataSource.getRepository(OrderPerson);
-      for (const person of disabledPersons) {
+      for (let i = 0; i < disabledPersons.length; i++) {
+        const person = disabledPersons[i];
         const orderPerson = orderPersonRepo.create({
         const orderPerson = orderPersonRepo.create({
           orderId: order.id,
           orderId: order.id,
           personId: person.id,
           personId: person.id,

+ 4 - 4
allin-packages/disability-module/src/routes/person-extension.route.ts

@@ -19,7 +19,7 @@ type EnterpriseUser = z.infer<typeof EnterpriseUserResponseSchema>;
  */
  */
 const getWorkHistoryRoute = createRoute({
 const getWorkHistoryRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/{id}/work-history',
+  path: '/disability-person/{id}/work-history',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
   request: {
   request: {
     params: z.object({
     params: z.object({
@@ -65,7 +65,7 @@ const getWorkHistoryRoute = createRoute({
  */
  */
 const getSalaryHistoryRoute = createRoute({
 const getSalaryHistoryRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/{id}/salary-history',
+  path: '/disability-person/{id}/salary-history',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
   request: {
   request: {
     params: z.object({
     params: z.object({
@@ -111,7 +111,7 @@ const getSalaryHistoryRoute = createRoute({
  */
  */
 const getCreditInfoRoute = createRoute({
 const getCreditInfoRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/{id}/credit-info',
+  path: '/disability-person/{id}/credit-info',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
   request: {
   request: {
     params: z.object({
     params: z.object({
@@ -157,7 +157,7 @@ const getCreditInfoRoute = createRoute({
  */
  */
 const getPersonVideosRoute = createRoute({
 const getPersonVideosRoute = createRoute({
   method: 'get',
   method: 'get',
-  path: '/{id}/videos',
+  path: '/disability-person/{id}/videos',
   middleware: [enterpriseAuthMiddleware],
   middleware: [enterpriseAuthMiddleware],
   request: {
   request: {
     params: z.object({
     params: z.object({

+ 25 - 5
allin-packages/disability-module/tests/integration/person-extension.integration.test.ts

@@ -6,7 +6,8 @@ import { UserEntity, Role } from '@d8d/user-module';
 import { File } from '@d8d/file-module';
 import { File } from '@d8d/file-module';
 import { Platform } from '@d8d/allin-platform-module/entities';
 import { Platform } from '@d8d/allin-platform-module/entities';
 import { EmploymentOrder, OrderPerson, OrderPersonAsset } from '@d8d/allin-order-module/entities';
 import { EmploymentOrder, OrderPerson, OrderPersonAsset } from '@d8d/allin-order-module/entities';
-import { DisabledPerson, DisabledBankCard } from '../../src/entities';
+import { BankName } from '@d8d/bank-names-module';
+import { DisabledPerson, DisabledBankCard, DisabledPhoto, DisabledRemark, DisabledVisit } from '../../src/entities';
 import personExtensionRoutes from '../../src/routes/person-extension.route';
 import personExtensionRoutes from '../../src/routes/person-extension.route';
 import { Company } from '@d8d/allin-company-module/entities';
 import { Company } from '@d8d/allin-company-module/entities';
 
 
@@ -14,7 +15,7 @@ import { Company } from '@d8d/allin-company-module/entities';
 setupIntegrationDatabaseHooksWithEntities([
 setupIntegrationDatabaseHooksWithEntities([
   UserEntity, File, Role, Platform, Company,
   UserEntity, File, Role, Platform, Company,
   EmploymentOrder, OrderPerson, OrderPersonAsset,
   EmploymentOrder, OrderPerson, OrderPersonAsset,
-  DisabledPerson, DisabledBankCard
+  DisabledPerson, BankName, DisabledBankCard, DisabledPhoto, DisabledRemark, DisabledVisit
 ])
 ])
 
 
 describe('人才扩展API集成测试', () => {
 describe('人才扩展API集成测试', () => {
@@ -82,10 +83,15 @@ describe('人才扩展API集成测试', () => {
     testDisabledPerson = disabledPersonRepo.create({
     testDisabledPerson = disabledPersonRepo.create({
       name: '测试残疾人',
       name: '测试残疾人',
       idCard: `110101${Date.now() % 100000000}`,
       idCard: `110101${Date.now() % 100000000}`,
-      gender: 1,
+      gender: '男',
       birthDate: new Date('1990-01-01'),
       birthDate: new Date('1990-01-01'),
       disabilityType: '视力残疾',
       disabilityType: '视力残疾',
       disabilityLevel: '一级',
       disabilityLevel: '一级',
+      disabilityId: `DIS${Date.now() % 100000000}`,
+      idAddress: '身份证地址',
+      phone: '13800138000',
+      province: '北京市',
+      city: '北京市',
       address: '测试地址'
       address: '测试地址'
     });
     });
     await disabledPersonRepo.save(testDisabledPerson);
     await disabledPersonRepo.save(testDisabledPerson);
@@ -188,10 +194,15 @@ describe('人才扩展API集成测试', () => {
       const otherDisabledPerson = disabledPersonRepo.create({
       const otherDisabledPerson = disabledPersonRepo.create({
         name: '其他公司残疾人',
         name: '其他公司残疾人',
         idCard: `110101${Date.now() % 100000000 + 1000}`,
         idCard: `110101${Date.now() % 100000000 + 1000}`,
-        gender: 2,
+        gender: '女',
         birthDate: new Date('1995-01-01'),
         birthDate: new Date('1995-01-01'),
         disabilityType: '听力残疾',
         disabilityType: '听力残疾',
         disabilityLevel: '二级',
         disabilityLevel: '二级',
+        disabilityId: `DIS${Date.now() % 100000000 + 1000}`,
+        idAddress: '其他地址',
+        phone: '13900139000',
+        province: '上海市',
+        city: '上海市',
         address: '其他地址'
         address: '其他地址'
       });
       });
       await disabledPersonRepo.save(otherDisabledPerson);
       await disabledPersonRepo.save(otherDisabledPerson);
@@ -245,12 +256,21 @@ describe('人才扩展API集成测试', () => {
       });
       });
       await fileRepository.save(testFile);
       await fileRepository.save(testFile);
 
 
+      // 创建银行名称记录
+      const bankNameRepo = dataSource.getRepository(BankName);
+      const bankName = bankNameRepo.create({
+        bankName: '测试银行',
+        bankCode: 'TESTBANK',
+        status: 1
+      });
+      await bankNameRepo.save(bankName);
+
       // 创建银行卡记录
       // 创建银行卡记录
       const bankCardRepo = dataSource.getRepository(DisabledBankCard);
       const bankCardRepo = dataSource.getRepository(DisabledBankCard);
       const bankCard = bankCardRepo.create({
       const bankCard = bankCardRepo.create({
         personId: testDisabledPerson.id,
         personId: testDisabledPerson.id,
         subBankName: '测试支行',
         subBankName: '测试支行',
-        bankNameId: 1, // 假设银行ID为1
+        bankNameId: bankName.id, // 使用实际创建的银行ID
         cardNumber: '6228481234567890123',
         cardNumber: '6228481234567890123',
         cardholderName: '测试持卡人',
         cardholderName: '测试持卡人',
         cardType: '一类卡',
         cardType: '一类卡',

+ 40 - 1
docs/stories/012.003.story.md

@@ -1,7 +1,7 @@
 # 故事 012.003:企业统计与人才扩展API
 # 故事 012.003:企业统计与人才扩展API
 
 
 ## 状态
 ## 状态
-Completed ✅
+Completed ✅ (代码实现和测试配置完成)
 
 
 ## 故事
 ## 故事
 **作为**企业用户,
 **作为**企业用户,
@@ -338,20 +338,59 @@ Completed ✅
 | 日期 | 版本 | 描述 | 作者 |
 | 日期 | 版本 | 描述 | 作者 |
 |------|------|------|------|
 |------|------|------|------|
 | 2025-12-16 | 1.0 | 初始故事创建 | Bob(Scrum Master) |
 | 2025-12-16 | 1.0 | 初始故事创建 | Bob(Scrum Master) |
+| 2025-12-16 | 1.1 | 更新开发代理记录,添加文件列表和完成笔记 | James |
 
 
 ## 开发代理记录
 ## 开发代理记录
 此部分由开发代理在实施过程中填充
 此部分由开发代理在实施过程中填充
 
 
 ### 使用的代理模型
 ### 使用的代理模型
+claude-sonnet
 
 
 
 
 ### 调试日志引用
 ### 调试日志引用
+- 测试运行输出:公司模块集成测试失败,缺少对`@d8d/allin-disability-module`的依赖
+- 测试运行输出:残疾人模块集成测试失败,`DisabledBankCard`实体缺少`BankName`实体配置
 
 
 
 
 ### 完成笔记列表
 ### 完成笔记列表
+- ✅ 所有API接口代码已实现:
+  - 企业概览统计接口 (`GET /api/v1/yongren/company/overview`)
+  - 企业维度人才统计接口 (`GET /api/v1/yongren/company/{id}/talents`)
+  - 人才工作历史查询接口 (`GET /api/v1/yongren/disability-person/{id}/work-history`)
+  - 人才薪资历史查询接口 (`GET /api/v1/yongren/disability-person/{id}/salary-history`)
+  - 个人征信信息查询接口 (`GET /api/v1/yongren/disability-person/{id}/credit-info`)
+  - 视频关联查询接口 (`GET /api/v1/yongren/disability-person/{id}/videos`)
+- ✅ 服务层方法已实现:
+  - `CompanyService.getCompanyOverview()`、`CompanyService.getCompanyTalents()`
+  - `DisabledPersonService.getWorkHistory()`、`getSalaryHistory()`、`getCreditInfo()`、`getPersonVideos()`
+- ✅ 数据库性能优化:相关字段索引已添加
+- ✅ 集成测试已编写:
+  - `company-statistics.integration.test.ts`(公司统计API测试)
+  - `person-extension.integration.test.ts`(人才扩展API测试)
+- ⚠️ 测试配置问题需要修复:
+  - 公司模块缺少`@d8d/allin-disability-module`依赖
+  - 残疾人模块测试缺少`BankName`实体配置
+- ✅ 代码符合项目编码标准和架构规范
 
 
 
 
 ### 文件列表
 ### 文件列表
+**公司模块 (`allin-packages/company-module/`)**:
+- `src/routes/company-statistics.route.ts` - 企业统计API路由
+- `src/schemas/company-statistics.schema.ts` - 企业统计Schema验证
+- `src/services/company.service.ts` - 新增 `getCompanyOverview()` 和 `getCompanyTalents()` 方法
+- `src/routes/index.ts` - 路由聚合,包含新路由
+- `tests/integration/company-statistics.integration.test.ts` - 企业统计API集成测试
+
+**残疾人模块 (`allin-packages/disability-module/`)**:
+- `src/routes/person-extension.route.ts` - 人才扩展API路由
+- `src/schemas/person-extension.schema.ts` - 人才扩展Schema验证
+- `src/services/disabled-person.service.ts` - 新增 `getWorkHistory()`、`getSalaryHistory()`、`getCreditInfo()`、`getPersonVideos()` 方法
+- `src/routes/index.ts` - 路由聚合,包含新路由
+- `tests/integration/person-extension.integration.test.ts` - 人才扩展API集成测试
+
+**依赖更新需求**:
+- `allin-packages/company-module/package.json` - 需要添加 `"@d8d/allin-disability-module": "workspace:*"` 依赖
+- `allin-packages/disability-module/tests/integration/person-extension.integration.test.ts` - 需要添加 `BankName` 实体到测试配置
 
 
 
 
 ## QA结果
 ## QA结果

+ 6 - 0
pnpm-lock.yaml

@@ -258,6 +258,9 @@ importers:
 
 
   allin-packages/company-module:
   allin-packages/company-module:
     dependencies:
     dependencies:
+      '@d8d/allin-disability-module':
+        specifier: workspace:*
+        version: link:../disability-module
       '@d8d/allin-enums':
       '@d8d/allin-enums':
         specifier: workspace:*
         specifier: workspace:*
         version: link:../enums
         version: link:../enums
@@ -270,6 +273,9 @@ importers:
       '@d8d/auth-module':
       '@d8d/auth-module':
         specifier: workspace:*
         specifier: workspace:*
         version: link:../../packages/auth-module
         version: link:../../packages/auth-module
+      '@d8d/bank-names-module':
+        specifier: workspace:*
+        version: link:../../packages/bank-names-module
       '@d8d/file-module':
       '@d8d/file-module':
         specifier: workspace:*
         specifier: workspace:*
         version: link:../../packages/file-module
         version: link:../../packages/file-module