2025-10-28
已完成 - 所有功能已实现并集成到真实数据库
实现组长端对客服提交的订单分配进行审批的完整流程,包括审批入口、审批操作、状态流转和历史记录。
路径: src/app/shared/components/order-approval-panel/
文件:
order-approval-panel.component.ts (185行)order-approval-panel.component.html (165行)order-approval-panel.component.scss (386行)功能:
文件: src/app/pages/designer/project-detail/project-detail.ts (新增100行)
新增属性:
showApprovalPanel: boolean = false;
companyId: string = '';
新增方法:
checkApprovalStatus() - 检查是否需要显示审批面板onApprovalCompleted() - 处理审批完成事件(通过/驳回)集成位置:
src/app/pages/designer/project-detail/project-detail.html
逻辑:
文件: src/modules/project/pages/project-detail/stages/stage-order.component.ts
修改的方法: submitForOrder()
变更内容:
// ❌ 旧逻辑:直接推进到"确认需求"
this.project.set('currentStage', '确认需求');
// ✅ 新逻辑:保持在"订单分配",标记为待审批
// 不修改 currentStage
data.approvalStatus = 'pending';
data.pendingApprovalBy = 'team-leader';
审批历史记录:
approvalHistory.push({
  stage: '订单分配',
  submitter: { id, name, role },
  submitTime: new Date(),
  status: 'pending',  // 待审批
  quotationTotal: this.quotation.total,
  teams: teamSnapshot
});
文件:
src/app/pages/team-leader/dashboard/dashboard.tssrc/app/pages/team-leader/dashboard/dashboard.htmlsrc/app/pages/team-leader/dashboard/dashboard.scss新增方法:
isPendingApproval(project: Project): boolean {
  const stage = project.currentStage?.trim();
  const data = (project as any).data || {};
  return stage === '订单分配' && data.approvalStatus === 'pending';
}
优化的 getter:
get pendingApprovalProjects(): Project[] {
  return this.projects.filter(p => {
    const stage = p.currentStage?.trim();
    const data = (p as any).data || {};
    return (stage === '订单分配' && data.approvalStatus === 'pending') ||
           stage === '待审批' || stage === '待确认';
  });
}
视觉增强:
文件:
src/modules/project/pages/project-detail/stages/stage-order.component.tssrc/modules/project/pages/project-detail/stages/stage-order.component.htmlsrc/modules/project/pages/project-detail/stages/stage-order.component.scss新增方法:
getApprovalStatus(): 'pending' | 'approved' | 'rejected' | null
getRejectionReason(): string
prepareResubmit(): void
审批状态横幅:
Project {
  currentStage: string,  // '订单分配' | '确认需求' | ...
  data: {
    // 新增字段
    approvalStatus?: 'pending' | 'approved' | 'rejected',
    approvalHistory: ApprovalRecord[],
    pendingApprovalBy?: 'team-leader',
    lastRejectionReason?: string
  }
}
interface ApprovalRecord {
  stage: string;              // '订单分配'
  submitter: {                // 提交人
    id: string;
    name: string;
    role: string;
  };
  submitTime: Date;           // 提交时间
  status: 'pending' | 'approved' | 'rejected';
  approver?: {                // 审批人(审批后填写)
    id: string;
    name: string;
    role: string;
  };
  approvalTime?: Date;        // 审批时间
  reason?: string;            // 驳回原因
  comment?: string;           // 审批备注
  quotationTotal: number;     // 报价总额快照
  teams: TeamSnapshot[];      // 团队分配快照
}
1. 客服填写订单信息
   ↓
2. 客服点击"提交订单分配"
   ↓
3. 项目标记为待审批 (approvalStatus: 'pending')
   ↓
4. 组长工作台显示待审批项目(橙色高亮)
   ↓
5. 组长点击项目查看详情
   ↓
6. 显示审批面板,查看订单信息
   ↓
7a. 通过审批                    7b. 驳回审批
   - 项目进入"确认需求"阶段        - 保持"订单分配"阶段
   - approvalStatus: 'approved'   - approvalStatus: 'rejected'
   - 记录审批人和时间              - 记录驳回原因
   ↓                               ↓
8a. 客服看到"审批通过"           8b. 客服看到驳回原因
                                  - 点击"修改并重新提交"
                                  - 修改后重新提交
~1,370行 新增/修改代码
// 直接使用Parse保存项目
const { Parse } = await import('fmode-ng/core');
const Project = Parse.Object.extend('Project');
const projectToSave = Project.createWithoutData(projectId);
projectToSave.set('currentStage', '确认需求');
projectToSave.set('data', data);
await projectToSave.save(null, { useMasterKey: true });
private detectRoleContextFromUrl(): 'customer-service' | 'designer' | 'team-leader' {
  const url = this.router.url || '';
  if (url.includes('/team-leader/')) return 'team-leader';
  // ...
}
private checkApprovalStatus(): void {
  const isTeamLeader = this.roleContext === 'team-leader';
  const currentStage = this.project.currentStage;
  const approvalStatus = this.project.data?.approvalStatus;
  
  this.showApprovalPanel = isTeamLeader && 
                           currentStage === '订单分配' && 
                           approvalStatus === 'pending';
}
新建文件:
- src/app/shared/components/order-approval-panel/
  - order-approval-panel.component.ts
  - order-approval-panel.component.html
  - order-approval-panel.component.scss
修改文件:
- src/app/pages/designer/project-detail/project-detail.ts
- src/app/pages/designer/project-detail/project-detail.html
- src/modules/project/pages/project-detail/stages/stage-order.component.ts
- src/modules/project/pages/project-detail/stages/stage-order.component.html
- src/modules/project/pages/project-detail/stages/stage-order.component.scss
- src/app/pages/team-leader/dashboard/dashboard.ts
- src/app/pages/team-leader/dashboard/dashboard.html
- src/app/pages/team-leader/dashboard/dashboard.scss
无需迁移 - 使用现有Project表的data字段存储审批数据
本次实施完成了完整的组长端订单审批功能,实现了:
所有功能已测试通过,可以正式投入使用!🚀
实施人员: Claude
实施日期: 2025-10-28
文档版本: v1.0.0