Story 010.001: 修复公司创建功能
Status
Completed
Story
As a 系统管理员
I want 能够成功创建新公司
so that 正常管理公司信息
Acceptance Criteria
- 填写公司名称"测试"及相关可选信息后,点击"创建"按钮能够成功生成新公司记录
- 创建成功后页面显示新创建的公司记录
- 错误处理机制完善,能够显示具体的错误信息
Tasks / Subtasks
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]
可能的问题点(基于史诗描述)
- 表单验证规则问题
- API参数处理问题
- 数据库约束问题
- 错误处理机制不完善
后端模块包规范
- 包结构: 遵循标准模块包结构 [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
- 发现实体字段与schema不一致:实体要求contactPerson和contactPhone不能为空,但schema允许它们为空
- 服务层没有为contactPerson和contactPhone设置默认值
- 前端表单验证可能有问题
Completion Notes List
- 修复了实体字段与schema不一致的问题:将contactPerson和contactPhone改为nullable: true
- 修复了平台ID可选问题:将platformId改为nullable: true,修复唯一性检查逻辑
- 修复了服务层默认值设置:为contactPerson和contactPhone设置空字符串默认值
- 修复了undefined值覆盖问题:服务层现在过滤掉undefined值,确保默认值不被覆盖
- 修复了前端错误信息显示问题:前端现在显示API返回的具体错误信息(如"公司名称在该平台下已存在")
- 添加了新的集成测试用例:验证可选字段为空时的创建和更新操作
- 添加了平台ID为空的测试用例:验证用户可以不提供platformId创建公司
- 所有测试通过,公司创建功能现在可以正常工作
File List
- allin-packages/company-module/src/entities/company.entity.ts - 修改contactPerson、contactPhone和platformId为可选字段
- allin-packages/company-module/src/services/company.service.ts - 修复默认值设置、undefined过滤和唯一性检查逻辑
- allin-packages/company-module/src/schemas/company.schema.ts - 更新platformId为可选字段
- allin-packages/company-module/tests/integration/company.integration.test.ts - 添加新的测试用例,包括平台ID为空的测试
- allin-packages/company-management-ui/src/components/CompanyManagement.tsx - 修复前端错误信息显示,提取API返回的具体错误信息
QA Results