# Story 010.001: 修复公司创建功能

## Status
Completed

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

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

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

## 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
