010.001.story.md 11 KB

Story 010.001: 修复公司创建功能

Status

Completed

Story

As a 系统管理员 I want 能够成功创建新公司 so that 正常管理公司信息

Acceptance Criteria

  1. 填写公司名称"测试"及相关可选信息后,点击"创建"按钮能够成功生成新公司记录
  2. 创建成功后页面显示新创建的公司记录
  3. 错误处理机制完善,能够显示具体的错误信息

Tasks / Subtasks

  • 分析公司创建失败的根本原因 (AC: 1, 3)
    • 检查前端表单验证逻辑
    • 检查后端API参数处理
    • 检查数据库约束和唯一性检查
    • 检查错误处理机制
  • 修复前端表单验证问题 (AC: 1, 3)
    • 检查并修复CreateCompanySchema验证规则
    • 确保必填字段验证正确
    • 优化错误信息显示
  • 修复后端API处理逻辑 (AC: 1, 2, 3)
    • 检查company.service.ts中的createCompany方法
    • 验证数据转换和默认值设置
    • 确保唯一性检查逻辑正确
    • 优化错误响应格式
  • 修复数据库操作问题 (AC: 1, 2)
    • 检查company.entity.ts中的实体定义
    • 验证数据库约束和索引
    • 确保软删除逻辑正确
  • 添加或修复集成测试 (AC: 1, 2, 3)
    • 创建公司创建成功测试用例
    • 创建公司创建失败测试用例(重复名称、无效参数等)
    • 验证错误响应格式
  • 验证修复效果 (AC: 1, 2, 3)
    • 手动测试公司创建功能
    • 验证错误处理机制
    • 确保页面正确显示新创建的公司

Dev Notes

项目结构信息

  • 后端模块位置: allin-packages/company-module/ [Source: architecture/source-tree.md#实际项目结构]
  • UI模块位置: allin-packages/company-management-ui/ [Source: architecture/source-tree.md#实际项目结构]
  • 公司实体文件: allin-packages/company-module/src/entities/company.entity.ts
  • 公司服务文件: allin-packages/company-module/src/services/company.service.ts
  • 公司路由文件: allin-packages/company-module/src/routes/company-custom.routes.ts
  • 公司Schema文件: allin-packages/company-module/src/schemas/company.schema.ts
  • 公司管理UI组件: allin-packages/company-management-ui/src/components/CompanyManagement.tsx

技术栈信息

  • 运行时: Node.js 20.18.3 [Source: architecture/tech-stack.md#现有技术栈维护]
  • 框架: Hono 4.8.5 [Source: architecture/tech-stack.md#现有技术栈维护]
  • 数据库: PostgreSQL 17 [Source: architecture/tech-stack.md#现有技术栈维护]
  • ORM: TypeORM 0.3.25 [Source: architecture/tech-stack.md#现有技术栈维护]
  • 验证: Zod [Source: architecture/tech-stack.md#现有技术栈维护]

数据模型信息

  • 公司实体字段:
    • id: number - 公司ID [Source: allin-packages/company-module/src/entities/company.entity.ts:13]
    • platformId: number - 平台ID [Source: allin-packages/company-module/src/entities/company.entity.ts:22]
    • companyName: string - 公司名称 [Source: allin-packages/company-module/src/entities/company.entity.ts:31]
    • contactPerson: string - 联系人 [Source: allin-packages/company-module/src/entities/company.entity.ts:40]
    • contactPhone: string - 联系电话 [Source: allin-packages/company-module/src/entities/company.entity.ts:49]
    • contactEmail: string - 联系邮箱(可选)[Source: allin-packages/company-module/src/entities/company.entity.ts:58]
    • address: string - 地址(可选)[Source: allin-packages/company-module/src/entities/company.entity.ts:67]
    • status: number - 状态(1-正常,0-禁用)[Source: allin-packages/company-module/src/entities/company.entity.ts:75]
    • createTime: Date - 创建时间 [Source: allin-packages/company-module/src/entities/company.entity.ts:83]
    • updateTime: Date - 更新时间 [Source: allin-packages/company-module/src/entities/company.entity.ts:92]
  • 唯一性约束: 公司名称在同一平台下必须唯一 [Source: allin-packages/company-module/src/entities/company.entity.ts:5]
  • 关联关系: 公司关联平台(多对一)[Source: allin-packages/company-module/src/entities/company.entity.ts:94]

API端点信息

  • 创建公司端点: POST /createCompany [Source: allin-packages/company-module/src/routes/company-custom.routes.ts:19]
  • 请求体Schema: CreateCompanySchema [Source: allin-packages/company-module/src/schemas/company.schema.ts:51]
  • 响应格式: { success: boolean } [Source: allin-packages/company-module/src/routes/company-custom.routes.ts:34]
  • 错误响应: 400(参数错误或名称重复),500(创建失败)[Source: allin-packages/company-module/src/routes/company-custom.routes.ts:39-50]

Schema验证规则

  • 公司名称: 必填,1-100字符 [Source: allin-packages/company-module/src/schemas/company.schema.ts:56]
  • 平台ID: 可选,正整数 [Source: allin-packages/company-module/src/schemas/company.schema.ts:52]
  • 联系人: 可选,最大50字符 [Source: allin-packages/company-module/src/schemas/company.schema.ts:60]
  • 联系电话: 可选,最大20字符 [Source: allin-packages/company-module/src/schemas/company.schema.ts:64]
  • 联系邮箱: 可选,有效邮箱格式,最大100字符 [Source: allin-packages/company-module/src/schemas/company.schema.ts:68]
  • 地址: 可选,最大200字符 [Source: allin-packages/company-module/src/schemas/company.schema.ts:72]

服务层逻辑

  • 创建方法: createCompany(data: Partial<Company>): Promise<boolean> [Source: allin-packages/company-module/src/services/company.service.ts:137]
  • 唯一性检查: 检查公司名称在同一平台下是否已存在 [Source: allin-packages/company-module/src/services/company.service.ts:17-24]
  • 默认值设置:
    • contactEmail: '' [Source: allin-packages/company-module/src/services/company.service.ts:28]
    • address: '' [Source: allin-packages/company-module/src/services/company.service.ts:29]
    • status: 1 [Source: allin-packages/company-module/src/services/company.service.ts:31]
    • createTime: new Date() [Source: allin-packages/company-module/src/services/company.service.ts:32]
    • updateTime: new Date() [Source: allin-packages/company-module/src/services/company.service.ts:33]

前端组件信息

  • 页面路径: 搜索菜单 > 公司管理 > 创建公司 [Source: docs/prd/epic-010-system-bug-fixes.md:41]
  • 创建按钮: data-testid="create-company-button" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:217]
  • 表单字段:
    • 公司名称: data-testid="create-company-name-input" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:358]
    • 联系人: data-testid="create-company-contact-person-input" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:375]
    • 联系电话: data-testid="create-company-contact-phone-input" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:392]
    • 联系邮箱: data-testid="create-company-contact-email-input" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:410]
    • 地址: data-testid="create-company-address-input" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:427]
  • 提交按钮: data-testid="submit-create-company-button" [Source: allin-packages/company-management-ui/src/components/CompanyManagement.tsx:446]

可能的问题点(基于史诗描述)

  1. 表单验证规则问题
  2. API参数处理问题
  3. 数据库约束问题
  4. 错误处理机制不完善

后端模块包规范

  • 包结构: 遵循标准模块包结构 [Source: architecture/backend-module-package-standards.md#包结构规范]
  • 实体设计: 使用id作为主键名,字段命名转换 [Source: architecture/backend-module-package-standards.md#实体设计规范]
  • 唯一性约束: 使用@Unique装饰器 [Source: architecture/backend-module-package-standards.md#唯一性约束]

Testing

  • 测试框架: Vitest 3.2.4 [Source: architecture/testing-strategy.md#工具版本]
  • 测试位置: allin-packages/company-module/tests/integration/ [Source: architecture/testing-strategy.md#集成测试]
  • 测试标准: 集成测试覆盖率目标 ≥ 60% [Source: architecture/testing-strategy.md#集成测试]
  • 测试模式: 使用shared-test-util进行数据库测试 [Source: architecture/testing-strategy.md#集成测试]
  • 测试要求:
    • 创建公司成功测试
    • 公司名称重复测试
    • 参数验证失败测试
    • 错误响应格式测试

项目结构注意事项

  • 公司模块位于allin-packages目录下,与核心packages目录分开
  • 需要确保模块间的依赖关系正确
  • 测试数据库配置需要正确设置

Change Log

Date Version Description Author
2025-12-12 1.0 故事创建 Bob (Scrum Master)
2025-12-12 1.1 修复公司创建功能:实体字段改为可选,服务层修复默认值处理,添加集成测试 James (Dev Agent)
2025-12-12 1.2 修复平台ID可选问题:platformId改为可选字段,修复唯一性检查逻辑,添加平台ID为空测试 James (Dev Agent)
2025-12-12 1.3 修复前端错误信息显示:前端现在显示API返回的具体错误信息 James (Dev Agent)

Dev Agent Record

Agent Model Used

James (Dev Agent)

Debug Log References

  1. 发现实体字段与schema不一致:实体要求contactPerson和contactPhone不能为空,但schema允许它们为空
  2. 服务层没有为contactPerson和contactPhone设置默认值
  3. 前端表单验证可能有问题

Completion Notes List

  1. 修复了实体字段与schema不一致的问题:将contactPerson和contactPhone改为nullable: true
  2. 修复了平台ID可选问题:将platformId改为nullable: true,修复唯一性检查逻辑
  3. 修复了服务层默认值设置:为contactPerson和contactPhone设置空字符串默认值
  4. 修复了undefined值覆盖问题:服务层现在过滤掉undefined值,确保默认值不被覆盖
  5. 修复了前端错误信息显示问题:前端现在显示API返回的具体错误信息(如"公司名称在该平台下已存在")
  6. 添加了新的集成测试用例:验证可选字段为空时的创建和更新操作
  7. 添加了平台ID为空的测试用例:验证用户可以不提供platformId创建公司
  8. 所有测试通过,公司创建功能现在可以正常工作

File List

  1. allin-packages/company-module/src/entities/company.entity.ts - 修改contactPerson、contactPhone和platformId为可选字段
  2. allin-packages/company-module/src/services/company.service.ts - 修复默认值设置、undefined过滤和唯一性检查逻辑
  3. allin-packages/company-module/src/schemas/company.schema.ts - 更新platformId为可选字段
  4. allin-packages/company-module/tests/integration/company.integration.test.ts - 添加新的测试用例,包括平台ID为空的测试
  5. allin-packages/company-management-ui/src/components/CompanyManagement.tsx - 修复前端错误信息显示,提取API返回的具体错误信息

QA Results