Răsfoiți Sursa

✨ feat(stories): 创建故事010.001修复公司创建功能

- 基于史诗010系统Bug修复需求创建第一个故事
- 详细分析公司创建功能的技术架构和可能问题点
- 包含完整的技术上下文:实体、服务、路由、Schema、UI组件
- 提供具体的实施任务和测试指导
- 通过故事草稿检查清单验证

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

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 1 săptămână în urmă
părinte
comite
f25f35f20b
1 a modificat fișierele cu 154 adăugiri și 0 ștergeri
  1. 154 0
      docs/stories/010.001.story.md

+ 154 - 0
docs/stories/010.001.story.md

@@ -0,0 +1,154 @@
+# Story 010.001: 修复公司创建功能
+
+## Status
+Draft
+
+## 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) |
+
+## Dev Agent Record
+
+### Agent Model Used
+
+### Debug Log References
+
+### Completion Notes List
+
+### File List
+
+## QA Results