# 订单分配组件集成快速指南
## 🚀 5分钟快速集成
### 步骤1:更新主组件导入(stage-order.component.ts)
在文件顶部添加导入:
```typescript
// 在现有导入后添加
import { ApprovalStatusBannerComponent } from './components/approval-status-banner/approval-status-banner.component';
import { LeaderApprovalBarComponent } from './components/leader-approval-bar/leader-approval-bar.component';
import { ProjectBasicInfoComponent } from './components/project-basic-info/project-basic-info.component';
import { OrderActionButtonsComponent } from './components/order-action-buttons/order-action-buttons.component';
```
在 `@Component` 装饰器的 `imports` 数组中添加:
```typescript
@Component({
selector: 'app-stage-order',
standalone: true,
imports: [
CommonModule,
FormsModule,
QuotationEditorComponent,
TeamAssignComponent,
CustomDatePickerComponent,
// ⭐ 新增子组件
ApprovalStatusBannerComponent,
LeaderApprovalBarComponent,
ProjectBasicInfoComponent,
OrderActionButtonsComponent
],
...
})
```
---
### 步骤2:更新主组件HTML(stage-order.component.html)
**替换审批状态部分(第14-44行)**
从:
```html
@if (project) {
@if (getApprovalStatus() === 'pending') {
...
}
@if (getApprovalStatus() === 'approved') {
...
}
@if (getApprovalStatus() === 'rejected') {
...
}
}
```
改为:
```html
@if (project) {
}
```
---
**替换组长审批操作条(第46-60行)**
从:
```html
@if (getApprovalStatus() === 'pending' && isTeamLeader && !isFromCustomerService) {
}
```
改为:
```html
@if (getApprovalStatus() === 'pending' && isTeamLeader && !isFromCustomerService) {
}
```
---
**替换项目基本信息(第62-167行)**
从:
```html
@if (projectInfoExpanded) {
}
```
改为:
```html
```
---
**替换操作按钮(第203-226行)**
从:
```html
@if (canEdit) {
}
```
改为:
```html
```
---
### 步骤3:清理主组件样式(stage-order.component.scss)
可以删除以下样式块(它们已移到子组件中):
```scss
// 删除这些样式块(2762行之前)
.approval-status-banner { ... }
.leader-approval-bar { ... }
.project-info-card { ... }
.action-buttons { ... }
// 以及移动端优化中对应的样式
@media (max-width: 480px) {
.approval-status-banner { ... }
.leader-approval-bar { ... }
.action-buttons { ... }
}
```
保留的样式:
- `.stage-order-container` - 容器布局
- `.card` - 通用卡片样式
- `.quotation-card` - 报价卡片样式(如果有)
- 其他布局相关样式
---
## 📝 完整的更新后HTML结构
```html
@if (loading) {
}
@if (!loading) {
@if (project) {
}
@if (getApprovalStatus() === 'pending' && isTeamLeader && !isFromCustomerService) {
}
}
```
---
## ✅ 测试清单
集成完成后,请测试以下功能:
### 桌面端测试
- [ ] 审批状态横幅显示正常(待审批/已通过/已驳回)
- [ ] 组长审批按钮显示和点击正常
- [ ] 项目信息表单展开/折叠正常
- [ ] 项目信息输入和保存正常
- [ ] 日期选择器工作正常
- [ ] 保存草稿按钮功能正常
- [ ] 确认订单按钮功能正常
### 移动端测试(≤480px)
- [ ] 审批状态横幅纵向布局居中
- [ ] 组长审批按钮纵向排列占满宽度
- [ ] 项目信息表单输入框高度≥44px
- [ ] 操作按钮触摸区域足够大
- [ ] 所有交互流畅无卡顿
### 功能测试
- [ ] 提交订单后状态变为待审批
- [ ] 组长通过审批后状态变为已通过
- [ ] 组长驳回订单后可重新提交
- [ ] 数据持久化正常
---
## 🐛 常见问题
### Q1: 组件未显示
**原因**:未在 `imports` 数组中添加组件
**解决**:检查 `@Component` 装饰器的 `imports` 数组
### Q2: 样式不生效
**原因**:子组件样式文件未创建或路径错误
**解决**:确保所有 `.scss` 文件已创建且路径正确
### Q3: 事件不触发
**原因**:事件名称不匹配或未绑定处理方法
**解决**:检查 `(eventName)` 和对应的处理方法
### Q4: 数据不更新
**原因**:未正确使用双向绑定或事件处理
**解决**:使用 `(eventChange)="property = $event"` 模式
---
## 🎨 样式定制
如需自定义子组件样式,可以:
### 方法1:使用CSS变量
在主组件样式中定义:
```scss
.stage-order-container {
--primary-color: #667eea;
--success-color: #4caf50;
--danger-color: #f44336;
}
```
在子组件中使用:
```scss
.btn-approve {
background: var(--primary-color);
}
```
### 方法2:通过@Input传递样式类
为子组件添加 `@Input() customClass: string`,允许父组件传递样式类名。
### 方法3:使用::ng-deep(不推荐)
```scss
:host ::ng-deep app-approval-status-banner {
.status-icon { font-size: 36px; }
}
```
---
## 📊 性能优化提示
所有子组件已使用 `ChangeDetectionStrategy.OnPush`,为了最佳性能:
1. **使用Immutable更新**
```typescript
// ✅ 好的做法
this.projectInfo = { ...this.projectInfo, title: 'new title' };
// ❌ 避免
this.projectInfo.title = 'new title';
```
2. **避免频繁变更检测**
```typescript
// 只在必要时调用
this.cdr.markForCheck();
```
3. **使用trackBy**
```html
@for (item of items; track item.id) { ... }
```
---
## 🔄 回滚方案
如果集成出现问题,可以快速回滚:
1. 从版本控制恢复原文件
2. 或注释掉子组件,恢复原HTML结构
3. 保留子组件文件,待修复后再集成
---
## 📞 需要帮助?
如遇到问题,请提供:
1. 错误信息或截图
2. 浏览器控制台日志
3. 具体的操作步骤
4. 预期行为 vs 实际行为
---
**最后更新**:2024-12-09
**状态**:✅ 集成指南完成,可开始集成