# Story 009.008: 公司创建优化

## Status
Ready for Review

## Story
**As a** 系统管理员
**I want** 创建公司时仅"公司名字"为必填项
**so that** 快速创建公司信息

## Acceptance Criteria
1. 创建公司表单中仅"公司名字"为必填
2. 其他所有字段（含平台）均设为非必填
3. 表单验证规则更新

## Tasks / Subtasks
- [x] 修改后端公司模块schema验证规则 (AC: 1, 2, 3)
  - [x] 修改`allin-packages/company-module/src/schemas/company.schema.ts`中的`CreateCompanySchema`
  - [x] 将`platformId`、`contactPerson`、`contactPhone`字段从必填改为可选
  - [x] 添加中文错误提示（参考平台管理模块的schema模式）
  - [x] 确保空字符串自动转换为undefined（使用Zod transform）
- [x] 更新前端公司管理UI表单配置 (AC: 1, 2, 3)
  - [x] 修改`allin-packages/company-management-ui/src/components/CompanyManagement.tsx`中的表单默认值
  - [x] 更新FormLabel显示，移除非必填字段的红色星号标记
  - [x] 验证表单提交时可选字段正确处理
- [x] 更新前端表单验证规则 (AC: 3)
  - [x] 确保前端使用更新后的schema进行验证
  - [x] 验证可选字段的默认值处理
- [x] 更新集成测试 (AC: 1, 2, 3)
  - [x] 修改`allin-packages/company-management-ui/tests/integration/company.integration.test.tsx`
  - [x] 添加测试用例验证仅公司名称为必填
  - [x] 添加测试用例验证可选字段可以留空
  - [x] 确保所有现有测试通过
- [x] 运行测试验证修改 (AC: 1, 2, 3)
  - [x] 运行公司管理UI包测试：`pnpm test`
  - [x] 运行公司模块测试：`pnpm test`
  - [x] 验证所有测试通过

## Dev Notes

### 技术栈信息 [Source: architecture/tech-stack.md]
- 前端框架：React 19.1.0
- 表单验证：Zod 4.0.15 + react-hook-form 7.61.1
- 构建工具：Vite 7.0.0
- 测试框架：Vitest 4.0.9 + Testing Library

### 项目结构信息 [Source: architecture/source-tree.md]
- 公司管理UI包路径：`allin-packages/company-management-ui/`
- 公司模块路径：`allin-packages/company-module/`
- 测试文件位置：与源码并列的`tests/`文件夹

### 编码标准和测试策略 [Source: architecture/coding-standards.md]
- 测试框架：使用Vitest + Testing Library
- 测试位置：`tests/`文件夹与源码并列
- 测试类型：单元测试、集成测试
- 覆盖率目标：核心业务逻辑 > 80%

### UI包开发规范 [Source: architecture/ui-package-standards.md]
- **表单组件模式规范**：必须使用条件渲染两个独立的Form组件（创建和编辑）
- **类型推断最佳实践**：必须使用RPC推断类型，而不是直接导入schema类型
- **测试选择器优化**：必须为关键交互元素添加`data-testid`属性
- **API调用一致性**：必须根据实际路由名称修正API调用

### 当前schema状态分析
根据`allin-packages/company-module/src/schemas/company.schema.ts`：
- `CreateCompanySchema`当前必填字段：`platformId`、`companyName`、`contactPerson`、`contactPhone`
- 可选字段：`contactEmail`、`address`
- 需要修改：仅保留`companyName`为必填，其他字段改为可选

### 参考实现模式
参考平台管理模块的schema优化模式（故事009.002）：
- 使用Zod transform将空字符串转换为undefined
- 添加中文错误提示
- 统一创建和更新DTO的验证规则

### 前端表单当前状态
根据`allin-packages/company-management-ui/src/components/CompanyManagement.tsx`：
- 创建表单默认值：所有字段都有默认值（包括必填字段）
- FormLabel显示：部分字段标记为"（可选）"
- 需要更新：修改默认值，更新FormLabel，确保验证规则一致

### 文件位置
- 后端schema文件：`allin-packages/company-module/src/schemas/company.schema.ts`
- 前端组件文件：`allin-packages/company-management-ui/src/components/CompanyManagement.tsx`
- 前端测试文件：`allin-packages/company-management-ui/tests/integration/company.integration.test.tsx`

### 技术约束
1. 数据库兼容性：现有数据不需要迁移
2. API向后兼容：修改schema不影响现有API调用
3. 前端默认值：需要与后端schema验证规则保持一致
4. 空字符串处理：使用Zod transform统一处理

### Testing
#### 测试标准 [Source: architecture/coding-standards.md]
- 测试文件位置：`tests/integration/`文件夹
- 测试框架：Vitest + Testing Library
- Mock模式：使用标准mock响应函数

#### 具体测试要求
1. **集成测试**：验证创建公司表单仅公司名称为必填
2. **边界测试**：测试可选字段留空、空字符串处理
3. **错误处理测试**：验证必填字段缺失时的错误提示
4. **兼容性测试**：确保现有功能不受影响

#### 测试选择器规范 [Source: architecture/ui-package-standards.md#测试选择器优化规范]
- 必须为表单元素添加`data-testid`属性
- 命名约定：kebab-case格式 `{action}-{element}-{purpose}`
- 示例：`data-testid="create-company-name-input"`

## Change Log
| Date | Version | Description | Author |
|------|---------|-------------|--------|
| 2025-12-10 | 1.0 | 初始故事创建 | Scrum Master Bob |

## Dev Agent Record

### Agent Model Used
- James (dev agent) - 全栈开发工程师

### Debug Log References
- 修复了测试"应该仅公司名称为必填字段"中的DOM查询问题
- 将表单类型推断从直接导入schema类型改为使用RPC推断类型

### Completion Notes List
1. 后端schema验证规则已修改：仅`companyName`为必填字段
2. 前端表单配置已更新：所有可选字段标记为"（可选）"
3. 表单类型推断已优化：使用RPC推断类型而非直接导入schema类型
4. 集成测试已更新并全部通过验证
5. 公司管理UI包和公司模块测试均通过

### File List
**修改的文件：**
1. `allin-packages/company-module/src/schemas/company.schema.ts` - 修改CreateCompanySchema验证规则
2. `allin-packages/company-management-ui/src/components/CompanyManagement.tsx` - 更新表单配置和类型推断
3. `allin-packages/company-management-ui/tests/integration/company.integration.test.tsx` - 更新集成测试

**新增/修改的功能：**
- 创建公司时仅"公司名字"为必填项
- 其他字段（platformId、contactPerson、contactPhone、contactEmail、address）均为可选
- 空字符串自动转换为undefined
- 使用RPC推断类型确保类型安全

## QA Results
