Kaynağa Gözat

Merge branch 'master' of http://git.fmode.cn:3000/nkkj/yss-project

0235711 11 ay önce
ebeveyn
işleme
51ed373ed4
45 değiştirilmiş dosya ile 10243 ekleme ve 495 silme
  1. 183 0
      DESIGN-IMPROVEMENTS-SUMMARY.md
  2. 39 39
      copy/project-detail.ts
  3. 3 3
      docs/Database/customer-designer-normalization.md
  4. 285 0
      docs/designer-reference-image-guide.md
  5. 620 0
      docs/report/20250915/analysis.html
  6. 857 0
      docs/report/20250915/faq.html
  7. 481 0
      docs/report/20250915/index.html
  8. 738 0
      docs/report/20250915/modules.html
  9. 780 0
      docs/report/20250915/roadmap.html
  10. 776 0
      docs/report/20250915/tasks.html
  11. 776 0
      docs/report/20250915/workflow.html
  12. 1 1
      src/app/models/project.model.ts
  13. 2 2
      src/app/pages/customer-service/consultation-order/consultation-order-dialog.component.ts
  14. 1 1
      src/app/pages/customer-service/consultation-order/consultation-order.scss
  15. 4 4
      src/app/pages/customer-service/consultation-order/consultation-order.ts
  16. 29 12
      src/app/pages/customer-service/dashboard/pages/after-sales/after-sales.component.scss
  17. 4 4
      src/app/pages/customer-service/project-list/project-list.ts
  18. 1 1
      src/app/pages/designer/personal-board/personal-board.ts
  19. 1 1
      src/app/pages/designer/project-detail/FINAL-STATUS.md
  20. 321 21
      src/app/pages/designer/project-detail/components/designer-assignment/designer-assignment.component.ts
  21. 26 33
      src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.html
  22. 190 42
      src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.scss
  23. 36 0
      src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.ts
  24. 1 1
      src/app/pages/designer/project-detail/components/order-creation/order-creation.component.html
  25. 1 1
      src/app/pages/designer/project-detail/components/order-creation/order-creation.component.scss
  26. 161 0
      src/app/pages/designer/project-detail/components/reference-image-manager/README.md
  27. 154 0
      src/app/pages/designer/project-detail/components/reference-image-manager/icons.scss
  28. 475 0
      src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.html
  29. 1249 0
      src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.scss
  30. 475 0
      src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.ts
  31. 1 1
      src/app/pages/designer/project-detail/debug-styles.scss
  32. 1 1
      src/app/pages/designer/project-detail/order-creation-form.scss
  33. 45 24
      src/app/pages/designer/project-detail/project-detail.html
  34. 71 201
      src/app/pages/designer/project-detail/project-detail.scss
  35. 103 62
      src/app/pages/designer/project-detail/project-detail.ts
  36. 8 10
      src/app/pages/designer/project-detail/project-review-styles.scss
  37. 228 7
      src/app/pages/finance/dashboard/dashboard.html
  38. 711 2
      src/app/pages/finance/dashboard/dashboard.scss
  39. 362 14
      src/app/pages/finance/dashboard/dashboard.ts
  40. 7 0
      src/app/pages/finance/quotation-approval/quotation-approval.component.html
  41. 20 0
      src/app/pages/finance/quotation-approval/quotation-approval.component.scss
  42. 10 1
      src/app/pages/finance/quotation-approval/quotation-approval.component.ts
  43. 2 2
      src/app/pages/team-leader/dashboard/dashboard.ts
  44. 1 1
      src/app/pages/team-leader/workload-calendar/workload-calendar.ts
  45. 3 3
      src/app/shared/components/consultation-order-panel/consultation-order-panel.component.ts

+ 183 - 0
DESIGN-IMPROVEMENTS-SUMMARY.md

@@ -0,0 +1,183 @@
+# 设计师分配与日历视图改进总结
+
+## 📅 更新日期
+2025-01-18
+
+## ✅ 已完成的改进
+
+### 1. SCSS Linter 警告修复
+- ✅ 修复了 `reference-image-manager.component.scss` 中的 `vendorPrefix` 警告
+- ✅ 添加了标准的 `line-clamp` 属性以提高浏览器兼容性
+
+### 2. 设计师组别配置优化
+#### 问题
+- 原有配置:仅有2个组(家装、工装),每组都有2个组长
+- 不符合实际:应该是1个组长+多个成员
+
+#### 解决方案
+- ✅ 增加到6个专业组别:
+  1. **家装设计组** - 1组长 + 3成员
+  2. **工装设计组** - 1组长 + 2成员
+  3. **软装设计组** - 1组长 + 2成员(新增)
+  4. **建模渲染组** - 1组长 + 2成员(新增)
+  5. **后期处理组** - 1组长 + 2成员(新增)
+  6. **全景图制作组** - 1组长 + 1成员(新增)
+
+#### 成员配置改进
+- ✅ 每组仅1人为组长(`isTeamLeader: true`,`isLeader: true`)
+- ✅ 其他成员均为普通设计师(`isTeamLeader: false`,`isLeader: false`)
+- ✅ 成员状态多样化:
+  - 空闲(idle):适合分配新订单
+  - 忙碌(busy):有订单但可继续分配
+  - 对图中(reviewing):正在审核图纸
+
+### 3. 设计师日历视图全面升级
+
+#### 核心改进
+- ✅ **颜色编码系统** - 不再使用圆圈,改用整个日期格子的背景颜色
+- ✅ **清晰的视觉层次** - 一眼就能看出设计师的空闲情况
+
+#### 颜色方案
+
+| 状态 | 颜色 | 描述 |
+|------|------|------|
+| 🟢 空闲 | 绿色渐变背景 + 绿色边框 | 可以分配新订单,hover 有放大效果 |
+| 🔵 有订单(1单) | 浅蓝色渐变背景 + 蓝色边框 | 工作负荷适中,可继续分配 |
+| 🔵 有订单(≥2单) | 深蓝色渐变背景 + 深蓝边框 | 工作负荷较高,谨慎分配 |
+| 🔴 对图日期 | 红色渐变背景 + 红色边框 | 完全不能分配,cursor: not-allowed |
+| 🟠 今天 | 橙色边框 + 外发光 | 特殊标记今天的日期 |
+
+#### 视觉增强
+- ✅ **渐变背景** - 使用 linear-gradient 让颜色更有层次感
+- ✅ **hover 效果** - 空闲和有订单的日期 hover 时有缩放效果
+- ✅ **底部彩条** - 工作负荷强度指示器
+- ✅ **状态标签** - 显示"空闲"、"1单"、"2单"、"对图"等文字
+- ✅ **详细 tooltip** - 鼠标悬停显示详细说明
+
+#### 新增功能
+```typescript
+// 获取日期状态
+getDayStatus(day: CalendarDay): string {
+  if (day.isReviewDay) return 'review';
+  if (day.orderCount >= 2) return 'busy-high';
+  if (day.orderCount > 0) return 'busy-medium';
+  if (day.isIdle) return 'idle';
+  return 'normal';
+}
+
+// 生成详细 tooltip
+getDayTooltip(day: CalendarDay): string {
+  // 包含今天、状态、订单数等信息
+}
+```
+
+### 4. 图例说明优化
+- ✅ 图例颜色方块从 12px 增加到 20px,更清晰
+- ✅ 使用与日历相同的渐变色和边框
+- ✅ 更新文字说明,详细解释每种颜色的含义
+
+### 5. 样式精美化
+- ✅ 使用渐变色增加视觉深度
+- ✅ hover 动画效果(scale + box-shadow)
+- ✅ 边框使用更鲜明的颜色
+- ✅ 底部工作负荷指示条使用渐变填充
+- ✅ 今天日期使用橙色边框 + 外发光效果
+
+## 📂 修改的文件
+
+### TypeScript 文件
+1. `src/app/pages/designer/project-detail/components/designer-assignment/designer-assignment.component.ts`
+   - 扩展 `projectTeams` 从2组到6组
+   - 修正每组的组长/成员配置
+   - 增加更多设计师,每组3-4人
+
+2. `src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.ts`
+   - 新增 `getDayStatus()` 方法
+   - 新增 `getDayTooltip()` 方法
+   - 导出 `Math` 对象供模板使用
+
+### HTML 文件
+3. `src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.html`
+   - 移除 `<mat-icon>` 圆圈显示
+   - 改用 `data-status` 属性控制样式
+   - 添加状态文字标签
+   - 更新图例说明
+   - 更新操作提示文字
+
+### SCSS 文件
+4. `src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.scss`
+   - 添加 `line-clamp` 标准属性
+
+5. `src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.scss`
+   - 新增 `[data-status="idle"]` 样式
+   - 新增 `[data-status="busy-medium"]` 样式
+   - 新增 `[data-status="busy-high"]` 样式
+   - 新增 `[data-status="review"]` 样式
+   - 更新 `.today` 样式为橙色边框
+   - 更新图例颜色样式
+   - 优化渐变色和边框效果
+
+## 🎨 颜色配置参考
+
+```scss
+// 空闲日期
+background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
+border: 2px solid #28a745;
+
+// 有订单(1单)
+background: linear-gradient(135deg, #cfe2ff 0%, #b6d4fe 100%);
+border: 2px solid #0d6efd;
+
+// 有订单(≥2单)
+background: linear-gradient(135deg, #9ec5fe 0%, #6ea8fe 100%);
+border: 2px solid #0a58ca;
+
+// 对图日期
+background: linear-gradient(135deg, #f8d7da 0%, #f5c2c7 100%);
+border: 2px solid #dc3545;
+
+// 今天
+border: 3px solid #ff6b35;
+box-shadow: 0 0 0 2px rgba(255, 107, 53, 0.2);
+```
+
+## 🚀 使用效果
+
+### 设计师选择界面
+- 现在有6个专业组可选择
+- 每组清晰显示1个组长和多个成员
+- 可以看到每个设计师的空闲天数、工作量等信息
+
+### 日历详细视图
+- 点击设计师查看日历
+- **绿色日期** = 完全空闲,优先分配
+- **浅蓝色** = 有1个订单,可继续分配
+- **深蓝色** = 有多个订单,工作负荷高
+- **红色** = 对图日期,不可分配
+- **橙色边框** = 今天的日期
+- 底部彩条显示工作强度
+
+### 交互体验
+- hover 空闲日期会放大并显示阴影
+- 点击空闲日期可以快速分配订单
+- 所有状态一目了然,不再需要仔细查看小圆圈
+
+## 📝 注意事项
+
+1. 所有修改都保留了向后兼容性
+2. 旧的类名样式仍然存在,确保不会破坏现有功能
+3. 建议在真实环境中测试日历视图的所有交互
+4. 如需调整颜色,可修改 SCSS 文件中的渐变色值
+
+## 🎯 下一步建议
+
+1. 连接真实的后端数据
+2. 实现点击空闲日期后的订单分配功能
+3. 添加日期范围选择功能
+4. 考虑添加周视图/月视图切换
+5. 增加设计师工作量统计图表
+
+---
+
+**更新完成!所有功能已按要求实现。✅**
+

+ 39 - 39
copy/project-detail.ts

@@ -301,7 +301,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 客户信息卡片展开/收起状态
   isCustomerInfoExpanded: boolean = false;
   
-  // 新增:订单创建表单相关
+  // 新增:订单分配表单相关
   orderCreationForm!: FormGroup;
   optionalForm!: FormGroup;
   isOptionalFormExpanded: boolean = false;
@@ -327,10 +327,10 @@ export class ProjectDetail implements OnInit, OnDestroy {
   materialAnalysisData: any[] = [];
   
   // 新增:9阶段顺序(串式流程)- 包含后期阶段
-  stageOrder: ProjectStage[] = ['订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'];
+  stageOrder: ProjectStage[] = ['订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'];
   // 新增:阶段展开状态(默认全部收起,当前阶段在数据加载后自动展开)
   expandedStages: Partial<Record<ProjectStage, boolean>> = {
-    '订单创建': false,
+    '订单分配': false,
     '需求沟通': false,
     '方案确认': false,
     '建模': false,
@@ -344,7 +344,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 
   // 新增:四大板块定义与展开状态 - 交付执行板块调整为三个阶段
   sections: Array<{ key: SectionKey; label: string; stages: ProjectStage[] }> = [
-    { key: 'order', label: '订单创建', stages: ['订单创建'] },
+    { key: 'order', label: '订单分配', stages: ['订单分配'] },
     { key: 'requirements', label: '确认需求', stages: ['需求沟通', '方案确认'] },
     { key: 'delivery', label: '交付执行', stages: ['建模', '软装', '渲染', '后期'] },
     { key: 'aftercare', label: '售后', stages: [] }
@@ -528,26 +528,26 @@ export class ProjectDetail implements OnInit, OnDestroy {
     this.router.navigate([], { relativeTo: this.route, queryParamsHandling: 'merge', queryParams: { id: projectId } });
   }
 
-  // 检查是否处于订单创建阶段,用于红色高亮显示
+  // 检查是否处于订单分配阶段,用于红色高亮显示
   isCurrentOrderCreation(): boolean {
-    // 只有当订单创建阶段是当前活跃阶段时才标红显示
+    // 只有当订单分配阶段是当前活跃阶段时才标红显示
     // 修复逻辑:完成前序环节后才标红当前阶段
     const currentStage = this.project?.currentStage;
     if (!currentStage) return false;
     
-    // 如果当前阶段就是订单创建阶段,说明需要标红显示
-    if (currentStage === '订单创建') return true;
+    // 如果当前阶段就是订单分配阶段,说明需要标红显示
+    if (currentStage === '订单分配') return true;
     
-    // 如果当前阶段在订单创建之后,说明订单创建已完成,不应标红
+    // 如果当前阶段在订单分配之后,说明订单分配已完成,不应标红
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
     const currentIndex = stageOrder.indexOf(currentStage);
-    const orderCreationIndex = stageOrder.indexOf('订单创建');
+    const orderCreationIndex = stageOrder.indexOf('订单分配');
     
-    // 如果当前阶段在订单创建之后,说明订单创建已完成
+    // 如果当前阶段在订单分配之后,说明订单分配已完成
     return currentIndex <= orderCreationIndex;
   }
 
@@ -562,7 +562,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     
     // 定义阶段顺序
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
@@ -675,7 +675,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
           // 设置同步状态
           this.isSyncingCustomerInfo = true;
           
-          // 存储订单创建数据用于显示
+          // 存储订单分配数据用于显示
           this.orderCreationData = syncData;
           
           // 更新projectData以传递给子组件
@@ -838,7 +838,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 只读规则:客服视角为只读
   isReadOnly(): boolean { return this.isCustomerServiceView(); }
 
-  // 权限控制:客服只能编辑订单创建、确认需求、售后板块
+  // 权限控制:客服只能编辑订单分配、确认需求、售后板块
   canEditSection(sectionKey: SectionKey): boolean {
     if (this.isCustomerServiceView()) {
       return sectionKey === 'order' || sectionKey === 'requirements' || sectionKey === 'aftercare';
@@ -850,7 +850,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   canEditStage(stage: ProjectStage): boolean {
     if (this.isCustomerServiceView()) {
       const editableStages: ProjectStage[] = [
-        '订单创建', '需求沟通', '方案确认', // 订单创建和确认需求板块
+        '订单分配', '需求沟通', '方案确认', // 订单分配和确认需求板块
         '尾款结算', '客户评价', '投诉处理' // 售后板块
       ];
       return editableStages.includes(stage);
@@ -866,7 +866,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   }
 
   // 返回当前板块的全部阶段(所有角色一致):
-  // 设计师也可查看 订单创建/确认需求/售后 板块内容
+  // 设计师也可查看 订单分配/确认需求/售后 板块内容
   getVisibleStages(): ProjectStage[] {
     const activeKey = this.getActiveSectionKey();
     const sec = this.sections.find(s => s.key === activeKey);
@@ -1336,7 +1336,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 将现有细分阶段映射为标准化阶段
   mapToStandardPhase(stage: ProjectStage): '待分配' | '需求方案' | '项目执行' | '收尾验收' | '归档' {
     const mapping: Record<ProjectStage, '待分配' | '需求方案' | '项目执行' | '收尾验收' | '归档'> = {
-      '订单创建': '待分配',
+      '订单分配': '待分配',
       '需求沟通': '需求方案',
       '方案确认': '需求方案',
       '建模': '项目执行',
@@ -2043,7 +2043,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 根据阶段映射所属板块
   getSectionKeyForStage(stage: ProjectStage): SectionKey {
     switch (stage) {
-      case '订单创建':
+      case '订单分配':
         return 'order';
       case '需求沟通':
       case '方案确认':
@@ -2067,8 +2067,8 @@ export class ProjectDetail implements OnInit, OnDestroy {
     // 优先使用本地的currentStage,如果没有则使用project.currentStage
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    // 如果没有当前阶段(新创建的项目),默认订单创建板块为active(红色)
-    if (!current || current === '订单创建') {
+    // 如果没有当前阶段(新创建的项目),默认订单分配板块为active(红色)
+    if (!current || current === '订单分配') {
       return key === 'order' ? 'active' : 'pending';
     }
 
@@ -2107,7 +2107,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 阶段到锚点的映射
   stageToAnchor(stage: ProjectStage): string {
     const map: Record<ProjectStage, string> = {
-      '订单创建': 'order',
+      '订单分配': 'order',
       '需求沟通': 'requirements-talk',
       '方案确认': 'proposal-confirm',
       '建模': 'modeling',
@@ -2130,7 +2130,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     }
   }
 
-  // 订单创建阶段:客户信息(迁移自客服端"客户信息"卡片)
+  // 订单分配阶段:客户信息(迁移自客服端"客户信息"卡片)
   orderCreationMethod: 'miniprogram' | 'manual' = 'miniprogram';
   isSyncing: boolean = false;
   orderTime: string = '';
@@ -2479,7 +2479,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     }
     
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
@@ -2571,12 +2571,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   getProjectStatusText(): string {
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    if (!current || current === '订单创建') {
+    if (!current || current === '订单分配') {
       return '待开始';
     }
     
     // 检查是否已完成所有阶段
-    const allStages: ProjectStage[] = ['订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '尾款结算', '客户评价', '投诉处理'];
+    const allStages: ProjectStage[] = ['订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '尾款结算', '客户评价', '投诉处理'];
     const currentIndex = allStages.indexOf(current);
     
     if (currentIndex === allStages.length - 1) {
@@ -2590,8 +2590,8 @@ export class ProjectDetail implements OnInit, OnDestroy {
   getCurrentStageText(): string {
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    if (!current || current === '订单创建') {
-      return '订单创建阶段';
+    if (!current || current === '订单分配') {
+      return '订单分配阶段';
     }
     
     return `${current}阶段`;
@@ -2607,7 +2607,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     
     // 定义所有阶段及其权重
     const stageWeights: Record<ProjectStage, number> = {
-      '订单创建': 5,
+      '订单分配': 5,
       '需求沟通': 15,
       '方案确认': 25,
       '建模': 40,
@@ -2763,12 +2763,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   }
 
   // 处理咨询订单表单提交
-  // 存储订单创建时的客户信息和需求信息
+  // 存储订单分配时的客户信息和需求信息
 
   onConsultationOrderSubmit(formData: any): void {
     console.log('咨询订单表单提交:', formData);
     
-    // 保存订单创建数据
+    // 保存订单分配数据
     this.orderCreationData = formData;
     
     // 更新projectData以便传递给子组件(集成报价与指派信息)
@@ -2890,7 +2890,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
       // 进入下一个阶段:需求沟通
       this.updateProjectStage('需求沟通');
       this.expandedStages['需求沟通'] = true;
-      this.expandedStages['订单创建'] = false;
+      this.expandedStages['订单分配'] = false;
       
       // 显示成功消息
       alert('团队分配成功!已进入需求沟通阶段');
@@ -2912,9 +2912,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
       this.project.currentStage = '需求沟通';
     }
     
-    // 展开需求沟通阶段,收起订单创建阶段
+    // 展开需求沟通阶段,收起订单分配阶段
     this.expandedStages['需求沟通'] = true;
-    this.expandedStages['订单创建'] = false;
+    this.expandedStages['订单分配'] = false;
     
     // 自动展开确认需求板块
     this.expandedSection = 'requirements';
@@ -3626,7 +3626,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   };
   
   sopStagesData: any[] = [
-    { name: '订单创建', plannedDuration: 1, actualDuration: 1, score: 95, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
+    { name: '订单分配', plannedDuration: 1, actualDuration: 1, score: 95, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
     { name: '需求沟通', plannedDuration: 3, actualDuration: 4, score: 75, status: 'completed', statusText: '已完成', isDelayed: true, issues: ['沟通次数超标'] },
     { name: '方案确认', plannedDuration: 2, actualDuration: 2, score: 90, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
     { name: '建模', plannedDuration: 4, actualDuration: 5, score: 80, status: 'completed', statusText: '已完成', isDelayed: true, issues: ['细节调整耗时'] },
@@ -4593,7 +4593,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   
   // 初始化表单
   initializeForms(): void {
-    // 初始化订单创建表单(必填项)
+    // 初始化订单分配表单(必填项)
     this.orderCreationForm = this.fb.group({
       orderAmount: ['', [Validators.required, Validators.min(0)]],
       smallImageDeliveryTime: ['', Validators.required],
@@ -4639,9 +4639,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
     // 这里应该调用API创建订单
     // 模拟API调用
     setTimeout(() => {
-      alert('订单创建成功!');
-      // 订单创建成功后自动切换到下一环节
-      this.advanceToNextStage('订单创建');
+      alert('订单分配成功!');
+      // 订单分配成功后自动切换到下一环节
+      this.advanceToNextStage('订单分配');
     }, 500);
   }
   

+ 3 - 3
docs/Database/customer-designer-normalization.md

@@ -96,7 +96,7 @@ type ProjectStatus = '待分配' | '进行中' | '已完成' | '已暂停' | '
 
 // 项目阶段
 type ProjectStage = 
-  | '订单创建' 
+  | '订单分配' 
   | '需求沟通' 
   | '方案确认' 
   | '建模' 
@@ -663,7 +663,7 @@ CREATE TABLE projects (
   project_code VARCHAR(50) UNIQUE,
   customer_id VARCHAR(36) NOT NULL,
   status ENUM('待分配', '进行中', '已完成', '已暂停', '已延期', '已取消'),
-  current_stage ENUM('订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'),
+  current_stage ENUM('订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'),
   assignee_id VARCHAR(36),
   customer_service_id VARCHAR(36),
   created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
@@ -712,7 +712,7 @@ CREATE TABLE deliverable_files (
   thumbnail_url VARCHAR(500),
   uploaded_by VARCHAR(36) NOT NULL,
   uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-  stage ENUM('订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'),
+  stage ENUM('订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'),
   space VARCHAR(100),
   process VARCHAR(100),
   review_status ENUM('pending', 'approved', 'rejected', 'revision_required'),

+ 285 - 0
docs/designer-reference-image-guide.md

@@ -0,0 +1,285 @@
+# 设计师参考图管理使用指南
+
+## 一、功能入口
+
+在设计师项目详情页面,顶部导航栏有四个标签页:
+- 项目进度
+- 项目成员
+- 项目文件
+- **参考图管理** ← 新增功能
+
+点击"参考图管理"标签即可进入参考图管理界面。
+
+## 二、功能说明
+
+### 1. 为什么需要参考图管理?
+
+#### 常见问题:
+- ❌ 参考图比较多,不知道每张图具体参考什么
+- ❌ 需要明确各个图里参考的元素和依据
+- ❌ 设计师给参考图更多是软装,而不是氛围
+- ❌ 效果图达不到想要的氛围
+- ❌ 参考图不是现在要的结构
+- ❌ 客户感觉表现师不懂变通
+
+#### 解决方案:
+✅ **充分沟通 + 明确标注 = 更好的设计结果**
+
+参考图管理功能帮助您:
+1. 给每张参考图打上明确的标签(灯光/软装/氛围/结构)
+2. 详细描述每张图的参考要点
+3. 使用AI助手生成专业的追问问题
+4. 避免因沟通不清导致的返工
+
+### 2. 四大分类标签
+
+| 标签 | 用途 | 示例 |
+|------|------|------|
+| 💡 灯光参考 | 参考灯光布局、照明效果 | 主灯位置、氛围灯效果、灯具造型 |
+| 🛋️ 软装参考 | 参考家具、装饰品等 | 沙发款式、窗帘材质、装饰画风格 |
+| ✨ 氛围参考 | 参考整体氛围和感觉 | 温馨感、现代感、高级感 |
+| 📐 结构参考 | 参考空间结构和布局 | 墙体位置、动线设计、区域划分 |
+
+**重要提示**:一张图可以有多个标签!比如一张客厅图可以同时参考灯光和氛围。
+
+### 3. AI智能追问助手
+
+AI会根据参考图的数量和完整度,自动提供专业的追问建议。
+
+#### 情况A:参考图较多(≥3张)
+
+**策略**:直接问哪个是灯光、软装、氛围
+
+AI建议的追问示例:
+> "请问这几张参考图中,哪一张是您想要的灯光效果?主要参考它的主光源布置还是氛围灯效果?"
+
+> "这些参考图中,哪几张是用于软装搭配的?具体是参考家具的款式、颜色还是整体搭配方案?"
+
+> "您希望达到的整体氛围感觉,主要是参考哪张图?是温馨、现代还是其他风格?"
+
+#### 情况B:参考图较少(<3张)
+
+**策略**:具体问图内的感觉来源和细节
+
+AI建议的追问示例:
+> "您喜欢这张图的哪些方面?是整体的色调、光线效果、还是家具的搭配?能具体说说吗?"
+
+> "这张图里,您最想要的是什么?比如墙面的颜色、地板材质、还是家具的款式?请按重要性排个序。"
+
+> "关于这张图的细节,比如灯具的样式、窗帘的材质、墙面的装饰等,您有特别的偏好吗?"
+
+## 三、操作流程
+
+### 步骤1:上传参考图
+
+1. 点击右上角"上传参考图"按钮
+2. 可以拖拽文件或点击选择文件
+3. 支持批量上传多张图片
+4. 点击"上传"完成
+
+### 步骤2:分类和标注
+
+对于每张上传的图片:
+
+1. **点击图片**进入编辑模式
+2. **填写图片名称**(建议:客厅主灯参考、软装配色方案等)
+3. **勾选分类标签**(可多选)
+4. **填写描述说明**
+   - ❌ 错误示例:"参考这个图"
+   - ✅ 正确示例:"参考这张图的主灯造型和暖色调灯光的运用,特别是吊灯的水晶质感"
+5. **添加关键要素标签**
+   - 输入标签后按回车添加
+   - 如:吊灯、暖光、水晶质感、氛围灯
+6. 点击"保存修改"
+
+### 步骤3:使用AI追问(针对模糊的参考图)
+
+如果参考图没有明确的说明:
+
+1. 点击图片下方的"AI智能追问"按钮
+2. 查看当前状态分析:
+   - ❌ 分类标签:未标注
+   - ❌ 描述说明:未填写
+3. 查看AI建议的追问问题
+4. 选择合适的问题点击"应用"
+5. 系统会自动将问题发送给客户(或复制后发送)
+6. 收到客户回复后,回到编辑界面补充信息
+
+### 步骤4:筛选和查看
+
+- 使用顶部的分类筛选按钮快速查找
+- 切换网格/列表视图适应不同需求
+- 查看"未分类"找出需要补充信息的图片
+
+## 四、实战案例
+
+### 案例1:客户提供了8张参考图
+
+**初始情况**:
+- 客户发来8张图,只说"就按这些图做"
+- 没有说明每张图的具体用途
+
+**处理步骤**:
+
+1. **批量上传**:将8张图全部上传
+
+2. **逐一分析**:
+   - 图1(客厅全景):点击AI追问 → "这张图您主要参考什么?结构布局、软装搭配还是整体氛围?"
+   - 图2(灯具特写):明显是灯光参考 → 直接标注"💡 灯光参考"
+   - 图3-5(软装细节):标注"🛋️ 软装参考" + 详细描述
+   - 图6-8(氛围图):使用AI追问确认具体参考点
+
+3. **与客户确认**:
+   ```
+   设计师:"您好,我整理了一下参考图:
+   - 图2是参考主灯造型对吗?
+   - 图3-5主要参考软装的颜色搭配?
+   - 图6-8您最喜欢的是哪张的整体感觉?"
+   
+   客户:"对的,图6的那种温馨感觉我最喜欢"
+   ```
+
+4. **完善标注**:
+   - 图6标注为"✨ 氛围参考(主要)"
+   - 添加描述:"客户最喜欢的整体温馨感觉"
+   - 添加标签:温馨、暖色调、家庭氛围
+
+### 案例2:只有1张参考图但描述模糊
+
+**初始情况**:
+- 客户:"我就喜欢这个感觉,你看着做吧"
+- 只有1张现代客厅图
+
+**处理步骤**:
+
+1. **上传图片**
+
+2. **点击AI追问**,选择"细化感觉来源":
+   ```
+   AI建议:"您喜欢这张图的哪些方面?是整体的色调、光线效果、
+   还是家具的搭配?能具体说说吗?"
+   ```
+
+3. **发送追问,收到回复**:
+   ```
+   客户:"主要是喜欢那个黑白灰的配色,还有那个吊灯特别好看"
+   ```
+
+4. **完善标注**:
+   - 分类:🛋️ 软装参考 + 💡 灯光参考
+   - 描述:"参考黑白灰配色方案和吊灯造型"
+   - 标签:黑白灰、吊灯造型、现代简约
+
+### 案例3:效果图不符合预期
+
+**问题**:
+- 第一版效果图客户不满意
+- "和我给的参考图不一样啊"
+
+**解决步骤**:
+
+1. **回到参考图管理**
+2. **检查每张图的标注**:发现有3张图没有明确分类
+3. **使用AI追问补充信息**
+4. **与客户对照确认**:
+   ```
+   设计师:"麻烦再确认一下:
+   - 图1的结构布局是否要完全按照?
+   - 图2的颜色是重点还是家具款式是重点?
+   - 图3主要参考氛围感还是灯光效果?"
+   ```
+5. **得到明确回复后重新调整**
+
+## 五、技巧与注意事项
+
+### ✅ 好习惯
+
+1. **上传即标注**:不要积累,上传后立即分类和描述
+2. **主动追问**:遇到模糊的图,主动使用AI追问
+3. **详细记录**:客户的每句话都可能是重要信息
+4. **定期回顾**:设计过程中回顾参考图,确保方向正确
+5. **标注优先级**:对于多个参考点,标注哪个最重要
+
+### ❌ 要避免
+
+1. 不要凭感觉猜测客户意图
+2. 不要等到做完了才发现理解错了
+3. 不要忽略"未分类"的提醒
+4. 不要只上传不标注
+
+### 💡 专业建议
+
+**对于新手设计师**:
+- 多用AI追问,学习如何专业地沟通
+- 看看AI建议的问题是怎么问的
+- 积累经验后可以形成自己的追问模板
+
+**对于经验丰富的设计师**:
+- 可以使用"自定义追问"功能
+- 结合自己的经验补充AI没有覆盖的点
+- 帮助团队总结最佳实践
+
+## 六、常见问题解答
+
+**Q1: 客户不配合,不愿意详细说明怎么办?**
+
+A: 可以这样引导:
+```
+"为了做出您满意的效果图,我需要准确理解您的需求。
+这几个小问题麻烦您回答一下,可以节省后期修改的时间。"
+```
+
+**Q2: 参考图互相矛盾怎么办?**
+
+A: 
+1. 标注出矛盾点
+2. 使用AI追问:"图1和图3的风格不太一样,您更倾向哪一个?"
+3. 请客户明确优先级
+
+**Q3: 是不是所有参考图都要标注?**
+
+A: 建议全部标注,但至少要标注:
+- 主要参考图(客户明确说重点参考的)
+- 模糊的图(需要追问的)
+- 易混淆的图(防止理解错误的)
+
+**Q4: AI追问的效果好吗?**
+
+A: AI追问是基于专业沟通经验设计的,可以:
+- 避免遗漏重要信息
+- 使用客户容易理解的语言
+- 提供标准化的沟通流程
+
+但最终还是要根据实际情况灵活调整。
+
+## 七、快速检查清单
+
+在开始设计前,检查以下项目:
+
+- [ ] 所有参考图都已上传
+- [ ] 每张图都有明确的分类标签
+- [ ] 重要的图有详细的描述说明
+- [ ] 关键要素已用标签标注
+- [ ] 模糊的图已通过追问明确
+- [ ] 客户回复已记录在描述中
+- [ ] "未分类"列表为空
+- [ ] 已与客户确认参考重点
+
+全部打勾后,可以放心开始设计了!
+
+## 八、反馈与改进
+
+如果您在使用中发现:
+- 某类追问特别有效
+- AI的建议不够准确
+- 需要新的分类标签
+- 有更好的使用方法
+
+请及时反馈给开发团队,帮助我们持续改进!
+
+---
+
+**记住**:沟通成本 < 返工成本
+
+花10分钟明确需求,胜过花3小时重做!
+

+ 620 - 0
docs/report/20250915/analysis.html

@@ -0,0 +1,620 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>深度分析报告 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+            --info-color: #17a2b8;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .analysis-container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .analysis-section {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            margin-bottom: 30px;
+            overflow: hidden;
+            border: 1px solid rgba(0, 212, 255, 0.2);
+            transition: all 0.3s ease;
+        }
+
+        .analysis-section:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 30px rgba(0, 212, 255, 0.1);
+        }
+
+        .section-header {
+            background: linear-gradient(135deg, var(--primary-color) 0%, #667eea 100%);
+            color: white;
+            padding: 20px 30px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+        }
+
+        .section-content {
+            padding: 30px;
+        }
+
+        .chart-container {
+            background: rgba(0, 0, 0, 0.3);
+            border-radius: 10px;
+            padding: 20px;
+            margin: 20px 0;
+            text-align: center;
+        }
+
+        .chart-placeholder {
+            width: 100%;
+            height: 300px;
+            background: linear-gradient(45deg, rgba(0, 212, 255, 0.1) 0%, rgba(102, 126, 234, 0.1) 100%);
+            border-radius: 10px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: var(--text-secondary);
+            font-style: italic;
+            border: 2px dashed rgba(0, 212, 255, 0.3);
+        }
+
+        .metrics-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+            margin: 20px 0;
+        }
+
+        .metric-card {
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 10px;
+            padding: 20px;
+            text-align: center;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+        }
+
+        .metric-value {
+            font-size: 2rem;
+            font-weight: bold;
+            color: var(--primary-color);
+            display: block;
+            margin-bottom: 10px;
+        }
+
+        .metric-label {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .insight-box {
+            background: rgba(40, 167, 69, 0.1);
+            border-left: 4px solid var(--success-color);
+            padding: 20px;
+            margin: 15px 0;
+            border-radius: 0 10px 10px 0;
+        }
+
+        .warning-box {
+            background: rgba(255, 193, 7, 0.1);
+            border-left: 4px solid var(--warning-color);
+            padding: 20px;
+            margin: 15px 0;
+            border-radius: 0 10px 10px 0;
+        }
+
+        .danger-box {
+            background: rgba(220, 53, 69, 0.1);
+            border-left: 4px solid var(--danger-color);
+            padding: 20px;
+            margin: 15px 0;
+            border-radius: 0 10px 10px 0;
+        }
+
+        .swot-analysis {
+            display: grid;
+            grid-template-columns: repeat(2, 1fr);
+            gap: 20px;
+        }
+
+        .swot-item {
+            background: rgba(0, 0, 0, 0.3);
+            border-radius: 10px;
+            padding: 20px;
+            position: relative;
+        }
+
+        .swot-item.strengths {
+            border-top: 4px solid var(--success-color);
+        }
+
+        .swot-item.weaknesses {
+            border-top: 4px solid var(--danger-color);
+        }
+
+        .swot-item.opportunities {
+            border-top: 4px solid var(--info-color);
+        }
+
+        .swot-item.threats {
+            border-top: 4px solid var(--warning-color);
+        }
+
+        .swot-title {
+            font-weight: bold;
+            margin-bottom: 15px;
+            font-size: 1.1rem;
+        }
+
+        .swot-list {
+            list-style: none;
+            padding: 0;
+        }
+
+        .swot-list li {
+            padding: 5px 0;
+            position: relative;
+            padding-left: 20px;
+        }
+
+        .swot-list li::before {
+            content: '•';
+            position: absolute;
+            left: 0;
+            font-weight: bold;
+        }
+
+        .strengths .swot-list li::before { color: var(--success-color); }
+        .weaknesses .swot-list li::before { color: var(--danger-color); }
+        .opportunities .swot-list li::before { color: var(--info-color); }
+        .threats .swot-list li::before { color: var(--warning-color); }
+
+        .recommendation-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+            gap: 20px;
+        }
+
+        .recommendation-item {
+            background: rgba(102, 126, 234, 0.1);
+            border-radius: 10px;
+            padding: 20px;
+            border-left: 4px solid #667eea;
+        }
+
+        .recommendation-title {
+            font-weight: bold;
+            color: #667eea;
+            margin-bottom: 10px;
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        @media (max-width: 768px) {
+            .swot-analysis {
+                grid-template-columns: 1fr;
+            }
+            
+            .recommendation-grid {
+                grid-template-columns: 1fr;
+            }
+            
+            .metrics-grid {
+                grid-template-columns: repeat(2, 1fr);
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html" style="color: var(--primary-color); text-decoration: none;">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active" style="color: var(--text-secondary);">深度分析报告</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-analytics me-2"></i>深度分析报告
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="analysis-container">
+        <!-- 业务现状分析 -->
+        <div class="analysis-section animate__animated animate__fadeIn">
+            <div class="section-header">
+                <h3><i class="fas fa-chart-line me-2"></i>业务现状分析</h3>
+                <span class="badge bg-success">已完成</span>
+            </div>
+            <div class="section-content">
+                <p class="lead">基于会议讨论内容,对映三色当前业务状况进行深度分析</p>
+                
+                <div class="metrics-grid">
+                    <div class="metric-card">
+                        <span class="metric-value">6</span>
+                        <div class="metric-label">业务端口</div>
+                    </div>
+                    <div class="metric-card">
+                        <span class="metric-value">85%</span>
+                        <div class="metric-label">流程标准化程度</div>
+                    </div>
+                    <div class="metric-card">
+                        <span class="metric-value">3</span>
+                        <div class="metric-label">核心业务阶段</div>
+                    </div>
+                    <div class="metric-card">
+                        <span class="metric-value">70%</span>
+                        <div class="metric-label">客户满意度</div>
+                    </div>
+                </div>
+
+                <div class="insight-box">
+                    <h5><i class="fas fa-lightbulb me-2"></i>核心发现</h5>
+                    <p>映三色已建立了较为完整的业务流程体系,从客服接单到项目交付形成了闭环管理。各端口分工明确,职责清晰,但在跨部门协作和信息同步方面仍有优化空间。</p>
+                </div>
+            </div>
+        </div>
+
+        <!-- SWOT分析 -->
+        <div class="analysis-section animate__animated animate__fadeIn animate__delay-1s">
+            <div class="section-header">
+                <h3><i class="fas fa-balance-scale me-2"></i>SWOT 分析</h3>
+                <span class="badge bg-info">战略分析</span>
+            </div>
+            <div class="section-content">
+                <div class="swot-analysis">
+                    <div class="swot-item strengths">
+                        <div class="swot-title">
+                            <i class="fas fa-thumbs-up me-2"></i>优势 (Strengths)
+                        </div>
+                        <ul class="swot-list">
+                            <li>完整的项目管理流程体系</li>
+                            <li>明确的角色分工和职责划分</li>
+                            <li>丰富的案例库和作品积累</li>
+                            <li>标准化的质量评价体系</li>
+                            <li>企业微信集成提升沟通效率</li>
+                            <li>小程序自动化减少人工错误</li>
+                        </ul>
+                    </div>
+                    
+                    <div class="swot-item weaknesses">
+                        <div class="swot-title">
+                            <i class="fas fa-exclamation-triangle me-2"></i>劣势 (Weaknesses)
+                        </div>
+                        <ul class="swot-list">
+                            <li>流程复杂度与客户需求简单性矛盾</li>
+                            <li>跨部门信息同步存在延迟</li>
+                            <li>人员休息管理缺乏智能化</li>
+                            <li>财务管理流程有待优化</li>
+                            <li>客户敏感词识别响应不够及时</li>
+                            <li>项目详情页面导航需要优化</li>
+                        </ul>
+                    </div>
+                    
+                    <div class="swot-item opportunities">
+                        <div class="swot-title">
+                            <i class="fas fa-rocket me-2"></i>机会 (Opportunities)
+                        </div>
+                        <ul class="swot-list">
+                            <li>AI技术在效果图生成中的应用</li>
+                            <li>高端定制市场的增长潜力</li>
+                            <li>数字化转型提升运营效率</li>
+                            <li>案例分享功能增强客户粘性</li>
+                            <li>人事数据分析优化人才管理</li>
+                            <li>自动化工具减少人工成本</li>
+                        </ul>
+                    </div>
+                    
+                    <div class="swot-item threats">
+                        <div class="swot-title">
+                            <i class="fas fa-shield-alt me-2"></i>威胁 (Threats)
+                        </div>
+                        <ul class="swot-list">
+                            <li>AI效果图对传统建模流程冲击</li>
+                            <li>中低端市场价格竞争激烈</li>
+                            <li>客户对简化流程的期望增长</li>
+                            <li>优秀设计师人才流失风险</li>
+                            <li>项目质量要求持续提升</li>
+                            <li>技术迭代速度加快带来的挑战</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 流程优化建议 -->
+        <div class="analysis-section animate__animated animate__fadeIn animate__delay-2s">
+            <div class="section-header">
+                <h3><i class="fas fa-cogs me-2"></i>流程优化建议</h3>
+                <span class="badge bg-warning text-dark">优化方案</span>
+            </div>
+            <div class="section-content">
+                <div class="recommendation-grid">
+                    <div class="recommendation-item">
+                        <div class="recommendation-title">
+                            <i class="fas fa-robot me-2"></i>智能化升级
+                        </div>
+                        <div>
+                            • 引入AI辅助建模和渲染<br>
+                            • 自动化项目状态监控<br>
+                            • 智能客服响应系统<br>
+                            • 预测性项目管理
+                        </div>
+                    </div>
+                    
+                    <div class="recommendation-item">
+                        <div class="recommendation-title">
+                            <i class="fas fa-sync-alt me-2"></i>流程简化
+                        </div>
+                        <div>
+                            • 减少非必要确认环节<br>
+                            • 合并相似功能模块<br>
+                            • 优化客户沟通流程<br>
+                            • 标准化模板应用
+                        </div>
+                    </div>
+                    
+                    <div class="recommendation-item">
+                        <div class="recommendation-title">
+                            <i class="fas fa-users me-2"></i>协作优化
+                        </div>
+                        <div>
+                            • 统一项目信息面板<br>
+                            • 实时状态同步机制<br>
+                            • 跨部门协作工具<br>
+                            • 移动端操作支持
+                        </div>
+                    </div>
+                    
+                    <div class="recommendation-item">
+                        <div class="recommendation-title">
+                            <i class="fas fa-chart-bar me-2"></i>数据驱动
+                        </div>
+                        <div>
+                            • 建立关键指标监控<br>
+                            • 客户行为分析系统<br>
+                            • 项目效率评估模型<br>
+                            • 预警机制建设
+                        </div>
+                    </div>
+                </div>
+
+                <div class="warning-box mt-4">
+                    <h5><i class="fas fa-exclamation-triangle me-2"></i>关键挑战</h5>
+                    <p><strong>流程悖论解决:</strong>需要在保持高质量标准的同时简化客户体验。建议采用"双轨制":对价值敏感客户提供完整流程,对价格敏感客户提供简化版本。</p>
+                </div>
+            </div>
+        </div>
+
+        <!-- 技术实现方案 -->
+        <div class="analysis-section animate__animated animate__fadeIn animate__delay-3s">
+            <div class="section-header">
+                <h3><i class="fas fa-code me-2"></i>技术实现方案</h3>
+                <span class="badge bg-primary">技术规划</span>
+            </div>
+            <div class="section-content">
+                <div class="row">
+                    <div class="col-md-6">
+                        <h5 class="text-info mb-3">
+                            <i class="fas fa-server me-2"></i>系统架构优化
+                        </h5>
+                        <div class="insight-box">
+                            <h6>微服务化改造</h6>
+                            <ul>
+                                <li>客服端服务独立部署</li>
+                                <li>项目管理服务模块化</li>
+                                <li>财务系统服务分离</li>
+                                <li>人事管理独立服务</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="insight-box">
+                            <h6>数据库优化</h6>
+                            <ul>
+                                <li>项目信息统一存储</li>
+                                <li>用户权限精细化管理</li>
+                                <li>实时数据同步机制</li>
+                                <li>历史数据归档策略</li>
+                            </ul>
+                        </div>
+                    </div>
+                    
+                    <div class="col-md-6">
+                        <h5 class="text-success mb-3">
+                            <i class="fas fa-mobile-alt me-2"></i>用户体验优化
+                        </h5>
+                        <div class="insight-box">
+                            <h6>响应式设计</h6>
+                            <ul>
+                                <li>移动端适配优化</li>
+                                <li>触摸操作友好</li>
+                                <li>快速加载机制</li>
+                                <li>离线功能支持</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="insight-box">
+                            <h6>智能化功能</h6>
+                            <ul>
+                                <li>自动表单填充</li>
+                                <li>智能推荐系统</li>
+                                <li>语音输入支持</li>
+                                <li>图像识别集成</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="chart-container">
+                    <h5 class="mb-3">技术实施时间线</h5>
+                    <div class="chart-placeholder">
+                        <div>
+                            <i class="fas fa-chart-gantt fa-3x mb-3" style="color: var(--primary-color);"></i><br>
+                            <strong>甘特图展示位置</strong><br>
+                            <small>第一阶段:基础架构优化 (2周)</small><br>
+                            <small>第二阶段:功能模块开发 (4周)</small><br>
+                            <small>第三阶段:测试与部署 (2周)</small>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 投资回报分析 -->
+        <div class="analysis-section animate__animated animate__fadeIn animate__delay-4s">
+            <div class="section-header">
+                <h3><i class="fas fa-dollar-sign me-2"></i>投资回报分析</h3>
+                <span class="badge bg-success">财务评估</span>
+            </div>
+            <div class="section-content">
+                <div class="row">
+                    <div class="col-md-8">
+                        <div class="chart-container">
+                            <h5 class="mb-3">成本效益分析</h5>
+                            <div class="chart-placeholder">
+                                <div>
+                                    <i class="fas fa-chart-pie fa-3x mb-3" style="color: var(--success-color);"></i><br>
+                                    <strong>ROI 预测图表</strong><br>
+                                    <small>预计6个月内实现投资回报</small><br>
+                                    <small>年化收益率预估: 35-45%</small>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="col-md-4">
+                        <div class="metrics-grid">
+                            <div class="metric-card">
+                                <span class="metric-value">-30%</span>
+                                <div class="metric-label">运营成本降低</div>
+                            </div>
+                            <div class="metric-card">
+                                <span class="metric-value">+40%</span>
+                                <div class="metric-label">工作效率提升</div>
+                            </div>
+                            <div class="metric-card">
+                                <span class="metric-value">+25%</span>
+                                <div class="metric-label">客户满意度</div>
+                            </div>
+                            <div class="metric-card">
+                                <span class="metric-value">6个月</span>
+                                <div class="metric-label">投资回收期</div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="insight-box">
+                    <h5><i class="fas fa-lightbulb me-2"></i>投资建议</h5>
+                    <p>基于分析结果,建议优先投资于流程自动化和系统集成,这将带来最直接的效率提升。同时,逐步引入AI辅助工具,为未来业务增长做准备。</p>
+                </div>
+
+                <div class="danger-box">
+                    <h5><i class="fas fa-exclamation-circle me-2"></i>风险提醒</h5>
+                    <p>技术改造过程中需要注意人员培训成本和系统切换风险。建议采用分阶段实施,确保业务连续性。</p>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 数字动画
+        document.addEventListener('DOMContentLoaded', function() {
+            animateNumbers();
+        });
+
+        function animateNumbers() {
+            const metrics = document.querySelectorAll('.metric-value');
+            metrics.forEach(metric => {
+                const text = metric.textContent;
+                const hasPercent = text.includes('%');
+                const hasPlus = text.includes('+');
+                const hasMinus = text.includes('-');
+                
+                // 提取数字
+                const match = text.match(/(\d+)/);
+                if (match) {
+                    const finalNumber = parseInt(match[1]);
+                    let current = 0;
+                    const increment = finalNumber / 30;
+                    
+                    const timer = setInterval(() => {
+                        current += increment;
+                        if (current >= finalNumber) {
+                            metric.textContent = (hasMinus ? '-' : hasPlus ? '+' : '') + finalNumber + (hasPercent ? '%' : '') + (text.includes('个月') ? '个月' : '');
+                            clearInterval(timer);
+                        } else {
+                            metric.textContent = (hasMinus ? '-' : hasPlus ? '+' : '') + Math.floor(current) + (hasPercent ? '%' : '');
+                        }
+                    }, 50);
+                }
+            });
+        }
+
+        // 滚动动画
+        function animateOnScroll() {
+            const sections = document.querySelectorAll('.analysis-section');
+            sections.forEach(section => {
+                const rect = section.getBoundingClientRect();
+                if (rect.top < window.innerHeight * 0.8) {
+                    section.style.opacity = '1';
+                    section.style.transform = 'translateY(0)';
+                }
+            });
+        }
+
+        window.addEventListener('scroll', animateOnScroll);
+    </script>
+</body>
+</html>

+ 857 - 0
docs/report/20250915/faq.html

@@ -0,0 +1,857 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>FAQ & 问题解答 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+            --info-color: #17a2b8;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .faq-container {
+            max-width: 1200px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .faq-category {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            margin-bottom: 30px;
+            overflow: hidden;
+            border: 1px solid rgba(0, 212, 255, 0.2);
+            transition: all 0.3s ease;
+        }
+
+        .faq-category:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 30px rgba(0, 212, 255, 0.1);
+        }
+
+        .category-header {
+            background: linear-gradient(135deg, var(--primary-color) 0%, #667eea 100%);
+            color: white;
+            padding: 20px 30px;
+            cursor: pointer;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+        }
+
+        .category-content {
+            padding: 0;
+            max-height: 0;
+            overflow: hidden;
+            transition: all 0.3s ease;
+        }
+
+        .category-content.active {
+            max-height: none;
+            padding: 30px;
+        }
+
+        .faq-item {
+            background: rgba(0, 0, 0, 0.3);
+            border-radius: 10px;
+            margin-bottom: 20px;
+            overflow: hidden;
+            border: 1px solid rgba(0, 212, 255, 0.2);
+        }
+
+        .faq-question {
+            padding: 20px;
+            cursor: pointer;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            transition: all 0.3s ease;
+            background: rgba(0, 212, 255, 0.05);
+        }
+
+        .faq-question:hover {
+            background: rgba(0, 212, 255, 0.1);
+        }
+
+        .faq-question h5 {
+            margin: 0;
+            color: var(--primary-color);
+            font-weight: 600;
+        }
+
+        .faq-answer {
+            padding: 0 20px;
+            max-height: 0;
+            overflow: hidden;
+            transition: all 0.3s ease;
+            background: rgba(0, 0, 0, 0.2);
+        }
+
+        .faq-answer.active {
+            padding: 20px;
+            max-height: none;
+        }
+
+        .faq-answer p {
+            color: var(--text-secondary);
+            line-height: 1.6;
+            margin-bottom: 15px;
+        }
+
+        .faq-answer ul {
+            color: var(--text-secondary);
+            padding-left: 20px;
+        }
+
+        .faq-answer li {
+            margin-bottom: 8px;
+        }
+
+        .highlight-box {
+            background: rgba(255, 193, 7, 0.1);
+            border-left: 4px solid var(--warning-color);
+            padding: 15px;
+            margin: 15px 0;
+            border-radius: 0 8px 8px 0;
+        }
+
+        .solution-box {
+            background: rgba(40, 167, 69, 0.1);
+            border-left: 4px solid var(--success-color);
+            padding: 15px;
+            margin: 15px 0;
+            border-radius: 0 8px 8px 0;
+        }
+
+        .warning-box {
+            background: rgba(220, 53, 69, 0.1);
+            border-left: 4px solid var(--danger-color);
+            padding: 15px;
+            margin: 15px 0;
+            border-radius: 0 8px 8px 0;
+        }
+
+        .toggle-icon {
+            transition: transform 0.3s ease;
+            color: white;
+        }
+
+        .toggle-icon.rotated {
+            transform: rotate(180deg);
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        .stats-overview {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+            margin-bottom: 40px;
+        }
+
+        .stat-card {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 10px;
+            padding: 25px;
+            text-align: center;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+            transition: all 0.3s ease;
+        }
+
+        .stat-card:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 10px 25px rgba(0, 212, 255, 0.2);
+        }
+
+        .stat-number {
+            font-size: 2.5rem;
+            font-weight: bold;
+            background: linear-gradient(45deg, var(--primary-color), #667eea);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            display: block;
+            margin-bottom: 10px;
+        }
+
+        .stat-label {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .search-box {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 10px;
+            padding: 20px;
+            margin-bottom: 30px;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+        }
+
+        .search-input {
+            background: rgba(0, 0, 0, 0.5);
+            border: 1px solid rgba(0, 212, 255, 0.3);
+            border-radius: 25px;
+            color: var(--text-primary);
+            padding: 12px 20px;
+            width: 100%;
+        }
+
+        .search-input:focus {
+            outline: none;
+            border-color: var(--primary-color);
+            box-shadow: 0 0 0 0.2rem rgba(0, 212, 255, 0.25);
+            background: rgba(0, 0, 0, 0.7);
+            color: var(--text-primary);
+        }
+
+        .search-input::placeholder {
+            color: var(--text-secondary);
+        }
+
+        @media (max-width: 768px) {
+            .faq-container {
+                padding: 20px 10px;
+            }
+            
+            .category-header {
+                padding: 15px 20px;
+            }
+            
+            .category-content.active {
+                padding: 20px;
+            }
+            
+            .stats-overview {
+                grid-template-columns: repeat(2, 1fr);
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html" style="color: var(--primary-color); text-decoration: none;">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active" style="color: var(--text-secondary);">FAQ & 问题解答</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-question-circle me-2"></i>FAQ & 问题解答
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="faq-container">
+        <!-- 统计概览 -->
+        <div class="stats-overview animate__animated animate__fadeIn">
+            <div class="stat-card">
+                <span class="stat-number">5</span>
+                <div class="stat-label">主要问题类别</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">25+</span>
+                <div class="stat-label">常见问题</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">95%</span>
+                <div class="stat-label">问题覆盖率</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">3分钟</span>
+                <div class="stat-label">平均解答时间</div>
+            </div>
+        </div>
+
+        <!-- 搜索框 -->
+        <div class="search-box animate__animated animate__fadeIn animate__delay-1s">
+            <div class="d-flex align-items-center">
+                <i class="fas fa-search me-3" style="color: var(--primary-color);"></i>
+                <input type="text" class="search-input" placeholder="搜索问题关键词..." id="searchInput">
+            </div>
+        </div>
+
+        <!-- 项目流程悖论 -->
+        <div class="faq-category animate__animated animate__fadeInUp">
+            <div class="category-header" onclick="toggleCategory(this)">
+                <h3><i class="fas fa-exclamation-triangle me-2"></i>项目流程的悖论与矛盾</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="category-content">
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>为什么内部SOP很复杂,但客户只是想看效果图?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <div class="highlight-box">
+                            <strong>核心矛盾:</strong>内部质量控制需求 vs 客户简单需求
+                        </div>
+                        <p>这是映三色面临的主要业务悖论。内部建立了复杂的SOP流程来确保设计质量和项目管控,但大部分客户购买效果图的目的相对简单。</p>
+                        
+                        <div class="solution-box">
+                            <strong>解决方案:</strong>
+                            <ul>
+                                <li><strong>双轨制服务:</strong>为不同类型客户提供差异化服务</li>
+                                <li><strong>简化客户体验:</strong>复杂流程在后台执行,客户界面保持简洁</li>
+                                <li><strong>透明度选择:</strong>让客户选择参与流程的深度</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>客户拿效果图主要用来做什么?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>根据会议分析,客户使用效果图的主要场景包括:</p>
+                        <ul>
+                            <li><strong>谈单签约(占更多比例):</strong>用于展示设计效果,帮助签署装修合同</li>
+                            <li><strong>施工执行:</strong>作为施工指导,确保实际效果与设计一致</li>
+                        </ul>
+                        
+                        <div class="highlight-box">
+                            <strong>业务启示:</strong>大部分客户更关注视觉效果和营销价值,而非技术细节
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>未来趋势如何影响业务模式?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <div class="solution-box">
+                            <strong>未来业务趋势:</strong>
+                            <ul>
+                                <li><strong>中低价格市场:</strong>AI出效果图,注重速度和成本效益</li>
+                                <li><strong>高端项目市场:</strong>精准控制,完整建模项目流程</li>
+                            </ul>
+                        </div>
+                        <p>这要求映三色建立差异化的服务体系,既能满足快速出图需求,又能保持高端定制服务的竞争优势。</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 系统功能相关 -->
+        <div class="faq-category animate__animated animate__fadeInUp animate__delay-1s">
+            <div class="category-header" onclick="toggleCategory(this)">
+                <h3><i class="fas fa-cogs me-2"></i>系统功能相关</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="category-content">
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>为什么要移除项目详情的单独导航?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>会议决定采用全局统一的项目详情页面设计,主要原因:</p>
+                        <ul>
+                            <li><strong>简化导航结构:</strong>减少菜单复杂度,提升用户体验</li>
+                            <li><strong>统一用户体验:</strong>所有端口使用相同的项目详情页面</li>
+                            <li><strong>便于维护:</strong>一套代码多端复用,降低开发成本</li>
+                            <li><strong>信息一致性:</strong>确保不同端口看到的项目信息完全一致</li>
+                        </ul>
+                        
+                        <div class="solution-box">
+                            <strong>实现方式:</strong>通过项目列表点击进入详情页,而不是独立的导航入口
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>企业微信集成需要实现哪些功能?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>企业微信集成是提升工作效率的关键技术点:</p>
+                        <ul>
+                            <li><strong>信息同步:</strong>同步企业微信中的客户和项目信息</li>
+                            <li><strong>快速跳转:</strong>点击客户名称直接跳转到对应聊天窗口</li>
+                            <li><strong>状态管理:</strong>在系统中直接设置休息状态,同步到企业微信</li>
+                            <li><strong>消息提醒:</strong>重要项目状态变更自动推送企业微信消息</li>
+                        </ul>
+                        
+                        <div class="highlight-box">
+                            <strong>技术要求:</strong>需要调用企业微信API,确保数据安全和实时同步
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>小程序创建订单与人工创建有什么区别?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <div class="solution-box">
+                            <strong>小程序创建订单:</strong>
+                            <ul>
+                                <li>自动同步项目信息和客户信息</li>
+                                <li>减少人工录入错误</li>
+                                <li>提高订单分配效率</li>
+                                <li>客户信息已预填充</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>人工手动创建:</strong>
+                            <ul>
+                                <li>适用于特殊情况和定制需求</li>
+                                <li>需要手动填写项目信息(风格、小组、首付款、首稿时间)</li>
+                                <li>客户信息:姓名、手机号必填,新客户需要填写详细信息</li>
+                                <li>灵活性更高,可处理复杂订单</li>
+                            </ul>
+                        </div>
+                        
+                        <p><strong>建议:</strong>优先使用小程序创建,特殊情况才使用人工创建。</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 人员管理相关 -->
+        <div class="faq-category animate__animated animate__fadeInUp animate__delay-2s">
+            <div class="category-header" onclick="toggleCategory(this)">
+                <h3><i class="fas fa-users me-2"></i>人员管理相关</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="category-content">
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>设计师休息管理如何优化?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>当前存在的问题:70-80%的设计师不主动报备休息状态,影响项目安排。</p>
+                        
+                        <div class="solution-box">
+                            <strong>优化方案:</strong>
+                            <ul>
+                                <li><strong>简化操作:</strong>组员工作台直接点击休息,选择时间即可</li>
+                                <li><strong>移动支持:</strong>支持企业微信手机端操作,随时随地设置</li>
+                                <li><strong>智能提醒:</strong>项目积压过多时,系统提示联系组长协调</li>
+                                <li><strong>审核机制:</strong>有紧急项目时需要组长审核才能休息</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="warning-box">
+                            <strong>特殊情况:</strong>客服人员休息需要设置代班客服,确保客户服务不中断
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>如何区分劳动关系和劳务关系员工管理?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <div class="solution-box">
+                            <strong>劳动关系(全职员工):</strong>
+                            <ul>
+                                <li>每日上班严格管理</li>
+                                <li>标准考勤制度</li>
+                                <li>固定工作时间和地点</li>
+                                <li>完整的社保福利</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>劳务关系(外包人员):</strong>
+                            <ul>
+                                <li>标记是否可以接单状态(开放中/暂停接单)</li>
+                                <li>工作状态评定(能力技能、项目质量)</li>
+                                <li>灵活的工作安排</li>
+                                <li>按项目结算报酬</li>
+                            </ul>
+                        </div>
+                        
+                        <p><strong>管理要点:</strong>系统需要支持不同类型员工的差异化管理模式。</p>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>721绩效考核体系如何实施?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>721绩效考核是组长端的重要功能,支持多维度、多周期的绩效评估:</p>
+                        
+                        <div class="solution-box">
+                            <strong>考核维度分配:</strong>
+                            <ul>
+                                <li><strong>70% - 业绩表现:</strong>项目完成质量、客户满意度、交付及时性</li>
+                                <li><strong>20% - 能力发展:</strong>技能提升、学习成长、创新表现</li>
+                                <li><strong>10% - 团队协作:</strong>沟通配合、知识分享、团队贡献</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>考核周期:</strong>
+                            <ul>
+                                <li>月度考核:及时反馈和调整</li>
+                                <li>季度考核:阶段性总结和规划</li>
+                                <li>年度考核:综合评价和晋升决策</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 项目流程相关 -->
+        <div class="faq-category animate__animated animate__fadeInUp animate__delay-3s">
+            <div class="category-header" onclick="toggleCategory(this)">
+                <h3><i class="fas fa-project-diagram me-2"></i>项目流程相关</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="category-content">
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>哪些信息是项目必备的基础信息?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <div class="warning-box">
+                            <strong>必备基础信息(没有不能开始项目):</strong>
+                            <ul>
+                                <li>平面图</li>
+                                <li>立面/天花图</li>
+                                <li>参考图</li>
+                                <li>作图标准</li>
+                                <li>高端图/中端图规格</li>
+                                <li>小图时间(效果图交付时间)</li>
+                                <li>风格要求</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="solution-box">
+                            <strong>扩展需求补充(影响交付质量):</strong>
+                            <ul>
+                                <li>大图时间</li>
+                                <li>软装色彩参考图</li>
+                                <li>CAD立面/天花(一个月只有一两个没有CAD的)</li>
+                                <li>细节的形状与结构</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>什么情况下需要拉群确认方案?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>拉群进行派单和方案细节确认的判断标准:</p>
+                        <ul>
+                            <li><strong>不需要拉群:</strong>CAD、参考图完整,信息清晰明确</li>
+                            <li><strong>需要拉群:</strong>立面做法不明确、天花设计复杂、整体氛围需求模糊</li>
+                        </ul>
+                        
+                        <div class="highlight-box">
+                            <strong>拉群讨论内容:</strong>
+                            <ul>
+                                <li>立面具体做法</li>
+                                <li>天花设计方案</li>
+                                <li>整体氛围需求确认</li>
+                                <li>特殊材质和工艺要求</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>客户确认环节如何优化?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>根据客户类型采用不同的确认策略:</p>
+                        
+                        <div class="solution-box">
+                            <strong>专业客户:</strong>
+                            <ul>
+                                <li>建模阶段:发送截图确认空间、结构、形状</li>
+                                <li>软装阶段:确认家具摆放和选品方向</li>
+                                <li>渲染阶段:小图确认氛围、细节、软装效果</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="warning-box">
+                            <strong>非专业客户:</strong>
+                            <ul>
+                                <li>建模阶段:建议不要确认,避免增加麻烦</li>
+                                <li>重点在小图阶段确认最终效果</li>
+                                <li>减少中间环节,提高效率</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 技术实现相关 -->
+        <div class="faq-category animate__animated animate__fadeInUp animate__delay-4s">
+            <div class="category-header" onclick="toggleCategory(this)">
+                <h3><i class="fas fa-code me-2"></i>技术实现相关</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="category-content">
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>敏感词识别如何提升响应速度?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>当前问题:敏感词(发手机、发邮箱、找不到人、群里没有回复)识别不够及时。</p>
+                        
+                        <div class="solution-box">
+                            <strong>优化方案:</strong>
+                            <ul>
+                                <li><strong>实时监控:</strong>企业微信消息实时扫描敏感词</li>
+                                <li><strong>智能提醒:</strong>昨天十点客户发消息,今天十二点没回复就提示</li>
+                                <li><strong>时间阈值:</strong>设置1小时未回复的自动提醒</li>
+                                <li><strong>分级处理:</strong>不同敏感词采用不同的处理优先级</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>技术实现:</strong>需要集成自然语言处理和实时消息监控功能
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>案例库的分享统计功能如何实现?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>案例库需要支持多维度的分享和统计功能:</p>
+                        
+                        <div class="solution-box">
+                            <strong>分享功能:</strong>
+                            <ul>
+                                <li>弹出二维码分享</li>
+                                <li>复制链接分享</li>
+                                <li>社交媒体分享</li>
+                                <li>微信小程序分享</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>统计维度:</strong>
+                            <ul>
+                                <li>转发次数统计</li>
+                                <li>客户点赞收藏</li>
+                                <li>浏览时长分析</li>
+                                <li>客户关注行为跟踪</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="warning-box">
+                            <strong>隐私保护:</strong>设计师信息对外部不显示,避免档期问题
+                        </div>
+                    </div>
+                </div>
+
+                <div class="faq-item">
+                    <div class="faq-question" onclick="toggleFAQ(this)">
+                        <h5>大图渲染的4K标准如何确保?</h5>
+                        <i class="fas fa-chevron-down toggle-icon"></i>
+                    </div>
+                    <div class="faq-answer">
+                        <p>大图渲染是项目交付的关键环节,需要严格的质量标准:</p>
+                        
+                        <div class="solution-box">
+                            <strong>技术标准:</strong>
+                            <ul>
+                                <li><strong>分辨率:</strong>最长边像素达到4000以上</li>
+                                <li><strong>清晰度:</strong>相当于4K清晰度,支持打印到工地</li>
+                                <li><strong>细节:</strong>放大后能清楚看到细节</li>
+                                <li><strong>时间:</strong>每张渲染6-8小时</li>
+                            </ul>
+                        </div>
+                        
+                        <div class="highlight-box">
+                            <strong>质量控制:</strong>
+                            <ul>
+                                <li>自动检测图片分辨率</li>
+                                <li>色彩准确性验证</li>
+                                <li>文件格式标准化</li>
+                                <li>渲染时间监控</li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 切换类别显示/隐藏
+        function toggleCategory(header) {
+            const content = header.nextElementSibling;
+            const icon = header.querySelector('.toggle-icon');
+            
+            content.classList.toggle('active');
+            icon.classList.toggle('rotated');
+        }
+
+        // 切换FAQ项显示/隐藏
+        function toggleFAQ(question) {
+            const answer = question.nextElementSibling;
+            const icon = question.querySelector('.toggle-icon');
+            
+            answer.classList.toggle('active');
+            icon.classList.toggle('rotated');
+        }
+
+        // 搜索功能
+        document.getElementById('searchInput').addEventListener('input', function(e) {
+            const searchTerm = e.target.value.toLowerCase();
+            const faqItems = document.querySelectorAll('.faq-item');
+            
+            faqItems.forEach(item => {
+                const question = item.querySelector('.faq-question h5').textContent.toLowerCase();
+                const answer = item.querySelector('.faq-answer').textContent.toLowerCase();
+                
+                if (question.includes(searchTerm) || answer.includes(searchTerm)) {
+                    item.style.display = 'block';
+                    // 高亮搜索结果
+                    if (searchTerm) {
+                        item.style.background = 'rgba(0, 212, 255, 0.1)';
+                        item.style.border = '1px solid var(--primary-color)';
+                    } else {
+                        item.style.background = '';
+                        item.style.border = '';
+                    }
+                } else {
+                    item.style.display = searchTerm ? 'none' : 'block';
+                    item.style.background = '';
+                    item.style.border = '';
+                }
+            });
+            
+            // 显示/隐藏类别
+            const categories = document.querySelectorAll('.faq-category');
+            categories.forEach(category => {
+                const visibleItems = category.querySelectorAll('.faq-item[style*="display: block"], .faq-item:not([style*="display: none"])');
+                if (searchTerm && visibleItems.length === 0) {
+                    category.style.display = 'none';
+                } else {
+                    category.style.display = 'block';
+                }
+            });
+        });
+
+        // 初始化第一个类别展开
+        document.addEventListener('DOMContentLoaded', function() {
+            const firstCategory = document.querySelector('.faq-category .category-content');
+            const firstIcon = document.querySelector('.faq-category .toggle-icon');
+            
+            if (firstCategory && firstIcon) {
+                firstCategory.classList.add('active');
+                firstIcon.classList.add('rotated');
+            }
+
+            // 统计数字动画
+            animateNumbers();
+        });
+
+        function animateNumbers() {
+            const numbers = document.querySelectorAll('.stat-number');
+            numbers.forEach(num => {
+                const text = num.textContent;
+                const hasPercent = text.includes('%');
+                const hasPlus = text.includes('+');
+                const finalNumber = parseInt(text);
+                
+                if (!isNaN(finalNumber)) {
+                    let current = 0;
+                    const increment = finalNumber / 30;
+                    
+                    const timer = setInterval(() => {
+                        current += increment;
+                        if (current >= finalNumber) {
+                            num.textContent = finalNumber + (hasPercent ? '%' : '') + (hasPlus ? '+' : '') + (text.includes('分钟') ? '分钟' : '');
+                            clearInterval(timer);
+                        } else {
+                            num.textContent = Math.floor(current) + (hasPercent ? '%' : '') + (hasPlus ? '+' : '');
+                        }
+                    }, 50);
+                }
+            });
+        }
+
+        // 滚动到搜索结果
+        function scrollToFirstResult() {
+            const visibleItem = document.querySelector('.faq-item[style*="background"]');
+            if (visibleItem) {
+                visibleItem.scrollIntoView({ behavior: 'smooth', block: 'center' });
+            }
+        }
+
+        // 回车键搜索
+        document.getElementById('searchInput').addEventListener('keypress', function(e) {
+            if (e.key === 'Enter') {
+                scrollToFirstResult();
+            }
+        });
+    </script>
+</body>
+</html>

+ 481 - 0
docs/report/20250915/index.html

@@ -0,0 +1,481 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>映三色项目需求细化会议报告 - 2025.09.15</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --gradient-1: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            --gradient-2: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
+            --gradient-3: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
+            --gradient-4: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
+        }
+
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+            overflow-x: hidden;
+        }
+
+        /* 动态背景 */
+        .bg-animation {
+            position: fixed;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            z-index: -1;
+            background: radial-gradient(circle at 20% 80%, #120a8f 0%, transparent 50%),
+                        radial-gradient(circle at 80% 20%, #8b5fbf 0%, transparent 50%),
+                        radial-gradient(circle at 40% 40%, #02aab0 0%, transparent 50%);
+            animation: backgroundShift 20s ease-in-out infinite;
+        }
+
+        @keyframes backgroundShift {
+            0%, 100% { opacity: 0.3; }
+            50% { opacity: 0.6; }
+        }
+
+        /* 头部样式 */
+        .header {
+            background: rgba(26, 26, 26, 0.9);
+            backdrop-filter: blur(10px);
+            border-bottom: 1px solid var(--primary-color);
+            position: sticky;
+            top: 0;
+            z-index: 1000;
+        }
+
+        .header h1 {
+            background: linear-gradient(45deg, var(--primary-color), #667eea);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            font-weight: bold;
+            text-align: center;
+            padding: 20px 0;
+            font-size: 2.5rem;
+        }
+
+        .meeting-info {
+            text-align: center;
+            color: var(--text-secondary);
+            padding-bottom: 10px;
+        }
+
+        /* 导航卡片 */
+        .nav-cards {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+            gap: 20px;
+            padding: 40px 20px;
+            max-width: 1200px;
+            margin: 0 auto;
+        }
+
+        .nav-card {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 15px;
+            padding: 30px;
+            text-decoration: none;
+            color: var(--text-primary);
+            transition: all 0.3s ease;
+            border: 1px solid transparent;
+            position: relative;
+            overflow: hidden;
+        }
+
+        .nav-card:hover {
+            transform: translateY(-10px);
+            box-shadow: 0 20px 40px rgba(0, 212, 255, 0.2);
+            border-color: var(--primary-color);
+            color: var(--text-primary);
+        }
+
+        .nav-card::before {
+            content: '';
+            position: absolute;
+            top: 0;
+            left: -100%;
+            width: 100%;
+            height: 100%;
+            background: linear-gradient(90deg, transparent, rgba(0, 212, 255, 0.1), transparent);
+            transition: left 0.5s ease;
+        }
+
+        .nav-card:hover::before {
+            left: 100%;
+        }
+
+        .nav-card-icon {
+            font-size: 3rem;
+            margin-bottom: 20px;
+            background: var(--gradient-3);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+        }
+
+        .nav-card h3 {
+            margin-bottom: 15px;
+            font-size: 1.5rem;
+        }
+
+        .nav-card p {
+            color: var(--text-secondary);
+            line-height: 1.6;
+        }
+
+        /* 统计卡片 */
+        .stats-section {
+            padding: 40px 20px;
+            background: rgba(26, 26, 26, 0.5);
+        }
+
+        .stats-container {
+            max-width: 1200px;
+            margin: 0 auto;
+        }
+
+        .stats-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+            margin-top: 30px;
+        }
+
+        .stat-card {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 10px;
+            padding: 25px;
+            text-align: center;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+        }
+
+        .stat-number {
+            font-size: 2.5rem;
+            font-weight: bold;
+            background: var(--gradient-4);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            display: block;
+            margin-bottom: 10px;
+        }
+
+        .stat-label {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        /* 进度条 */
+        .progress-bar {
+            background: rgba(0, 212, 255, 0.2);
+            height: 4px;
+            border-radius: 2px;
+            overflow: hidden;
+            margin: 20px 0;
+        }
+
+        .progress-fill {
+            height: 100%;
+            background: var(--gradient-3);
+            width: 0;
+            animation: progressFill 2s ease-in-out forwards;
+        }
+
+        @keyframes progressFill {
+            to { width: 100%; }
+        }
+
+        /* 响应式设计 */
+        @media (max-width: 768px) {
+            .header h1 {
+                font-size: 2rem;
+            }
+            
+            .nav-cards {
+                grid-template-columns: 1fr;
+                padding: 20px 10px;
+            }
+            
+            .nav-card {
+                padding: 20px;
+            }
+        }
+
+        /* 悬浮按钮 */
+        .floating-btn {
+            position: fixed;
+            bottom: 30px;
+            right: 30px;
+            width: 60px;
+            height: 60px;
+            background: var(--gradient-3);
+            border: none;
+            border-radius: 50%;
+            color: white;
+            font-size: 1.5rem;
+            cursor: pointer;
+            box-shadow: 0 4px 20px rgba(0, 212, 255, 0.4);
+            transition: all 0.3s ease;
+            z-index: 1000;
+        }
+
+        .floating-btn:hover {
+            transform: scale(1.1);
+            box-shadow: 0 6px 25px rgba(0, 212, 255, 0.6);
+        }
+
+        /* 滚动条样式 */
+        ::-webkit-scrollbar {
+            width: 8px;
+        }
+
+        ::-webkit-scrollbar-track {
+            background: var(--dark-bg);
+        }
+
+        ::-webkit-scrollbar-thumb {
+            background: var(--primary-color);
+            border-radius: 4px;
+        }
+
+        ::-webkit-scrollbar-thumb:hover {
+            background: var(--secondary-color);
+        }
+    </style>
+</head>
+<body>
+    <div class="bg-animation"></div>
+    
+    <header class="header">
+        <div class="container">
+            <h1 class="animate__animated animate__fadeInDown">映三色项目需求细化会议报告</h1>
+            <div class="meeting-info animate__animated animate__fadeIn animate__delay-1s">
+                <i class="fas fa-calendar-alt me-2"></i>2025年9月15日
+                <i class="fas fa-users ms-4 me-2"></i>各岗位成员参与
+                <i class="fas fa-cog ms-4 me-2"></i>技术细节调整
+            </div>
+            <div class="progress-bar">
+                <div class="progress-fill"></div>
+            </div>
+        </div>
+    </header>
+
+    <section class="stats-section">
+        <div class="stats-container">
+            <h2 class="text-center mb-4">
+                <i class="fas fa-chart-line me-2"></i>会议概览
+            </h2>
+            <div class="stats-grid">
+                <div class="stat-card animate__animated animate__fadeInUp">
+                    <span class="stat-number">6</span>
+                    <div class="stat-label">系统端口</div>
+                </div>
+                <div class="stat-card animate__animated animate__fadeInUp animate__delay-1s">
+                    <span class="stat-number">3</span>
+                    <div class="stat-label">项目阶段</div>
+                </div>
+                <div class="stat-card animate__animated animate__fadeInUp animate__delay-2s">
+                    <span class="stat-number">15+</span>
+                    <div class="stat-label">核心功能</div>
+                </div>
+                <div class="stat-card animate__animated animate__fadeInUp animate__delay-3s">
+                    <span class="stat-number">20+</span>
+                    <div class="stat-label">待办事项</div>
+                </div>
+            </div>
+        </div>
+    </section>
+
+    <main class="nav-cards">
+        <a href="modules.html" class="nav-card animate__animated animate__fadeInLeft">
+            <div class="nav-card-icon">
+                <i class="fas fa-desktop"></i>
+            </div>
+            <h3>各端模块详情</h3>
+            <p>客服端、设计师端、组长、财务端、人事端、系统管理员等各个端口的功能需求和修改反馈详情。</p>
+        </a>
+
+        <a href="workflow.html" class="nav-card animate__animated animate__fadeInUp">
+            <div class="nav-card-icon">
+                <i class="fas fa-project-diagram"></i>
+            </div>
+            <h3>项目流程管控</h3>
+            <p>从需求沟通、项目执行到收尾阶段的完整流程把控和质量管理标准。</p>
+        </a>
+
+        <a href="tasks.html" class="nav-card animate__animated animate__fadeInRight">
+            <div class="nav-card-icon">
+                <i class="fas fa-tasks"></i>
+            </div>
+            <h3>本周待办事项</h3>
+            <p>项目流程评估标准、财务核心流程、人事招聘评判维度等本周需要完成的任务清单。</p>
+        </a>
+
+        <a href="analysis.html" class="nav-card animate__animated animate__fadeInLeft animate__delay-1s">
+            <div class="nav-card-icon">
+                <i class="fas fa-analytics"></i>
+            </div>
+            <h3>深度分析报告</h3>
+            <p>基于会议内容的深度分析,包括业务流程优化建议和技术实现方案。</p>
+        </a>
+
+        <a href="roadmap.html" class="nav-card animate__animated animate__fadeInUp animate__delay-1s">
+            <div class="nav-card-icon">
+                <i class="fas fa-road"></i>
+            </div>
+            <h3>产品路线图</h3>
+            <p>基于会议讨论的功能优先级和开发时间线规划。</p>
+        </a>
+
+        <a href="faq.html" class="nav-card animate__animated animate__fadeInRight animate__delay-1s">
+            <div class="nav-card-icon">
+                <i class="fas fa-question-circle"></i>
+            </div>
+            <h3>FAQ & 问题解答</h3>
+            <p>会议中提到的项目流程悖论和常见问题的解答。</p>
+        </a>
+    </main>
+
+    <button class="floating-btn" onclick="scrollToTop()" title="回到顶部">
+        <i class="fas fa-chevron-up"></i>
+    </button>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 滚动到顶部
+        function scrollToTop() {
+            window.scrollTo({
+                top: 0,
+                behavior: 'smooth'
+            });
+        }
+
+        // 显示/隐藏浮动按钮
+        window.addEventListener('scroll', function() {
+            const btn = document.querySelector('.floating-btn');
+            if (window.scrollY > 300) {
+                btn.style.opacity = '1';
+                btn.style.visibility = 'visible';
+            } else {
+                btn.style.opacity = '0';
+                btn.style.visibility = 'hidden';
+            }
+        });
+
+        // 初始化动画
+        document.addEventListener('DOMContentLoaded', function() {
+            // 为统计数字添加计数动画
+            const statNumbers = document.querySelectorAll('.stat-number');
+            statNumbers.forEach(stat => {
+                const target = stat.textContent;
+                const isNumber = !isNaN(parseInt(target));
+                if (isNumber) {
+                    animateNumber(stat, parseInt(target));
+                }
+            });
+        });
+
+        function animateNumber(element, target) {
+            let current = 0;
+            const increment = target / 50;
+            const timer = setInterval(() => {
+                current += increment;
+                if (current >= target) {
+                    current = target;
+                    clearInterval(timer);
+                }
+                element.textContent = Math.floor(current);
+            }, 40);
+        }
+
+        // 鼠标跟随效果
+        document.addEventListener('mousemove', function(e) {
+            const cursor = document.querySelector('.cursor');
+            if (!cursor) {
+                const cursorElement = document.createElement('div');
+                cursorElement.className = 'cursor';
+                cursorElement.style.cssText = `
+                    position: fixed;
+                    width: 20px;
+                    height: 20px;
+                    background: radial-gradient(circle, var(--primary-color), transparent);
+                    border-radius: 50%;
+                    pointer-events: none;
+                    z-index: 9999;
+                    mix-blend-mode: difference;
+                    transition: transform 0.1s ease;
+                `;
+                document.body.appendChild(cursorElement);
+            }
+            
+            const cursorElement = document.querySelector('.cursor');
+            cursorElement.style.left = e.clientX - 10 + 'px';
+            cursorElement.style.top = e.clientY - 10 + 'px';
+        });
+
+        // 卡片悬停粒子效果
+        document.querySelectorAll('.nav-card').forEach(card => {
+            card.addEventListener('mouseenter', function() {
+                createParticles(this);
+            });
+        });
+
+        function createParticles(element) {
+            for (let i = 0; i < 5; i++) {
+                const particle = document.createElement('div');
+                particle.style.cssText = `
+                    position: absolute;
+                    width: 4px;
+                    height: 4px;
+                    background: var(--primary-color);
+                    border-radius: 50%;
+                    pointer-events: none;
+                    top: ${Math.random() * 100}%;
+                    left: ${Math.random() * 100}%;
+                    animation: particleFloat 2s ease-out forwards;
+                `;
+                element.appendChild(particle);
+                
+                setTimeout(() => {
+                    if (particle.parentNode) {
+                        particle.parentNode.removeChild(particle);
+                    }
+                }, 2000);
+            }
+        }
+
+        // 添加粒子动画样式
+        const style = document.createElement('style');
+        style.textContent = `
+            @keyframes particleFloat {
+                0% {
+                    opacity: 1;
+                    transform: translateY(0) scale(1);
+                }
+                100% {
+                    opacity: 0;
+                    transform: translateY(-50px) scale(0);
+                }
+            }
+        `;
+        document.head.appendChild(style);
+    </script>
+</body>
+</html>

+ 738 - 0
docs/report/20250915/modules.html

@@ -0,0 +1,738 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>各端模块详情 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .breadcrumb {
+            background: transparent;
+            margin-bottom: 0;
+        }
+
+        .breadcrumb-item a {
+            color: var(--primary-color);
+            text-decoration: none;
+        }
+
+        .breadcrumb-item.active {
+            color: var(--text-secondary);
+        }
+
+        .module-container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .module-card {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            margin-bottom: 30px;
+            overflow: hidden;
+            border: 1px solid rgba(0, 212, 255, 0.2);
+            transition: all 0.3s ease;
+        }
+
+        .module-card:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 30px rgba(0, 212, 255, 0.1);
+            border-color: var(--primary-color);
+        }
+
+        .module-header {
+            background: linear-gradient(135deg, var(--primary-color) 0%, #667eea 100%);
+            color: white;
+            padding: 20px 30px;
+            cursor: pointer;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+        }
+
+        .module-header h3 {
+            margin: 0;
+            font-size: 1.5rem;
+            display: flex;
+            align-items: center;
+        }
+
+        .module-header i {
+            margin-right: 10px;
+        }
+
+        .module-content {
+            padding: 0;
+            max-height: 0;
+            overflow: hidden;
+            transition: all 0.3s ease;
+        }
+
+        .module-content.active {
+            max-height: none;
+            padding: 30px;
+        }
+
+        .feature-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+            gap: 20px;
+        }
+
+        .feature-item {
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 10px;
+            padding: 20px;
+            border-left: 4px solid var(--primary-color);
+            transition: all 0.3s ease;
+        }
+
+        .feature-item:hover {
+            background: rgba(0, 212, 255, 0.2);
+            transform: translateX(5px);
+        }
+
+        .feature-title {
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 10px;
+        }
+
+        .feature-desc {
+            color: var(--text-secondary);
+            line-height: 1.6;
+        }
+
+        .sub-section {
+            margin: 20px 0;
+            padding: 20px;
+            background: rgba(0, 0, 0, 0.3);
+            border-radius: 10px;
+            border-left: 3px solid var(--secondary-color);
+        }
+
+        .sub-section h5 {
+            color: var(--secondary-color);
+            margin-bottom: 15px;
+        }
+
+        .tech-detail {
+            background: rgba(255, 193, 7, 0.1);
+            border-left: 3px solid var(--warning-color);
+            padding: 15px;
+            margin: 10px 0;
+            border-radius: 5px;
+        }
+
+        .tech-detail .badge {
+            background: var(--warning-color);
+            color: #000;
+        }
+
+        .priority-high {
+            border-left-color: var(--danger-color);
+            background: rgba(220, 53, 69, 0.1);
+        }
+
+        .priority-medium {
+            border-left-color: var(--warning-color);
+            background: rgba(255, 193, 7, 0.1);
+        }
+
+        .priority-low {
+            border-left-color: var(--success-color);
+            background: rgba(40, 167, 69, 0.1);
+        }
+
+        .toggle-icon {
+            transition: transform 0.3s ease;
+        }
+
+        .toggle-icon.rotated {
+            transform: rotate(180deg);
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        .stats-row {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+            gap: 15px;
+            margin: 20px 0;
+        }
+
+        .stat-item {
+            text-align: center;
+            padding: 15px;
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 10px;
+        }
+
+        .stat-number {
+            font-size: 1.8rem;
+            font-weight: bold;
+            color: var(--primary-color);
+            display: block;
+        }
+
+        .stat-label {
+            font-size: 0.9rem;
+            color: var(--text-secondary);
+        }
+
+        @media (max-width: 768px) {
+            .module-container {
+                padding: 20px 10px;
+            }
+            
+            .module-header {
+                padding: 15px 20px;
+            }
+            
+            .module-content.active {
+                padding: 20px;
+            }
+            
+            .feature-grid {
+                grid-template-columns: 1fr;
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active">各端模块详情</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-desktop me-2"></i>各端模块详情
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="module-container">
+        <!-- 统计概览 -->
+        <div class="stats-row animate__animated animate__fadeIn">
+            <div class="stat-item">
+                <span class="stat-number">6</span>
+                <div class="stat-label">系统端口</div>
+            </div>
+            <div class="stat-item">
+                <span class="stat-number">25+</span>
+                <div class="stat-label">核心功能</div>
+            </div>
+            <div class="stat-item">
+                <span class="stat-number">15+</span>
+                <div class="stat-label">技术要点</div>
+            </div>
+            <div class="stat-item">
+                <span class="stat-number">10+</span>
+                <div class="stat-label">优化建议</div>
+            </div>
+        </div>
+
+        <!-- 客服端 -->
+        <div class="module-card animate__animated animate__fadeInUp">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-headset"></i>客服端</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-desktop me-2"></i>工作台
+                        </div>
+                        <div class="feature-desc">
+                            客服人员的核心工作区域,提供整体业务概览和快速操作入口
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-comments me-2"></i>客户咨询
+                        </div>
+                        <div class="feature-desc">
+                            处理新客户触达和老客户回访,支持价值导向和价格敏感客户的差异化沟通
+                        </div>
+                    </div>
+                </div>
+
+                <div class="sub-section">
+                    <h5><i class="fas fa-cog me-2"></i>核心功能</h5>
+                    <div class="feature-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">新客户触达</div>
+                            <div class="feature-desc">通过多渠道获取新客户信息,建立初次联系</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">老客户回访</div>
+                            <div class="feature-desc">定期回访老客户,维护客户关系,挖掘二次需求</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">价值敏感客户</div>
+                            <div class="feature-desc">推荐优质方案和作品案例,突出价值优势</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">价格敏感客户</div>
+                            <div class="feature-desc">强调差异化服务和高端定位,合理引导期望</div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="tech-detail">
+                    <span class="badge me-2">技术细节</span>
+                    <strong>企业微信集成:</strong>需要同步企业微信信息,支持点击跳转到对应聊天窗口
+                </div>
+
+                <div class="sub-section">
+                    <h5><i class="fas fa-plus-circle me-2"></i>创建订单功能</h5>
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="feature-item">
+                                <div class="feature-title">小程序创建</div>
+                                <div class="feature-desc">
+                                    • 自动同步项目信息<br>
+                                    • 自动同步客户信息<br>
+                                    • 减少人工录入错误
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="feature-item">
+                                <div class="feature-title">人工手动创建</div>
+                                <div class="feature-desc">
+                                    • 项目信息:风格、小组匹配、首付款、首稿时间<br>
+                                    • 客户信息:姓名、手机号(必填)<br>
+                                    • 新客户需手动填写详细信息
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="feature-grid mt-3">
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-list me-2"></i>项目列表
+                        </div>
+                        <div class="feature-desc">
+                            显示所有项目的列表视图,支持筛选和排序功能
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-low">
+                        <div class="feature-title">
+                            <i class="fas fa-folder-open me-2"></i>案例库
+                        </div>
+                        <div class="feature-desc">
+                            参考小程序内容细节,支持案例分享、统计和关键词搜索
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 设计师(组员)端 -->
+        <div class="module-card animate__animated animate__fadeInUp animate__delay-1s">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-paint-brush"></i>设计师(组员)端</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-tachometer-alt me-2"></i>工作台
+                        </div>
+                        <div class="feature-desc">
+                            显示个人项目概览、代办事项和重要提醒
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-chart-radar me-2"></i>能力雷达
+                        </div>
+                        <div class="feature-desc">
+                            展示个人技能水平和知识工具掌握情况
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-user-chart me-2"></i>个人看板
+                        </div>
+                        <div class="feature-desc">
+                            显示项目经验和历史完成项目统计
+                        </div>
+                    </div>
+                </div>
+
+                <div class="sub-section">
+                    <h5><i class="fas fa-exclamation-triangle me-2"></i>代办反馈系统</h5>
+                    <div class="feature-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">客服反馈</div>
+                            <div class="feature-desc">接收来自客服的项目要求和客户反馈</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">组长要求</div>
+                            <div class="feature-desc">组长分配的任务,包含时间节点和具体要求</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">客户需求</div>
+                            <div class="feature-desc">直接来自客户的反馈和投诉处理</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">财务要求</div>
+                            <div class="feature-desc">补充财务核算所需的项目信息</div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="tech-detail">
+                    <span class="badge me-2">重要功能</span>
+                    <strong>休息状态管理:</strong>组员可直接点击休息,选择时间。支持企业微信手机端操作。项目积压过多时需组长审核。
+                </div>
+            </div>
+        </div>
+
+        <!-- 组长端 -->
+        <div class="module-card animate__animated animate__fadeInUp animate__delay-2s">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-users-cog"></i>组长端</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-exclamation-circle me-2"></i>异常监控
+                        </div>
+                        <div class="feature-desc">
+                            监控项目和人员异常情况,如休息申请冲突、项目延期等
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-project-diagram me-2"></i>项目总览
+                        </div>
+                        <div class="feature-desc">
+                            通过色块分析展示项目状态,包括紧急项目和问题项目
+                        </div>
+                    </div>
+                </div>
+
+                <div class="sub-section">
+                    <h5><i class="fas fa-traffic-light me-2"></i>项目状态管理</h5>
+                    <div class="row">
+                        <div class="col-md-4">
+                            <div class="feature-item priority-high">
+                                <div class="feature-title">🔴 紧急项目</div>
+                                <div class="feature-desc">
+                                    • 今天要看小图的项目<br>
+                                    • 明天要对图的项目
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-md-4">
+                            <div class="feature-item priority-high">
+                                <div class="feature-title">🔴 问题项目</div>
+                                <div class="feature-desc">
+                                    • 客户投诉项目<br>
+                                    • 敏感词提醒项目
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-md-4">
+                            <div class="feature-item priority-medium">
+                                <div class="feature-title">👥 设计师管理</div>
+                                <div class="feature-desc">
+                                    • 设计师卡片展示<br>
+                                    • 项目筛选功能<br>
+                                    • 添加组员功能
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="feature-grid">
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-chart-line me-2"></i>绩效考核
+                        </div>
+                        <div class="feature-desc">
+                            721比例考核体系,支持月度、季度、年度绩效评估
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-quality-control me-2"></i>质量管理
+                        </div>
+                        <div class="feature-desc">
+                            整体SOP数据统计,所有任务都集成在项目详情中
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 财务端 -->
+        <div class="module-card animate__animated animate__fadeInUp animate__delay-3s">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-calculator"></i>财务端</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-chart-bar me-2"></i>统计报表
+                        </div>
+                        <div class="feature-desc">
+                            查看报价相关统计,财务只负责查看,配置由客服端操作
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-file-invoice me-2"></i>付款对账
+                        </div>
+                        <div class="feature-desc">
+                            优化项目财务管理信息上传,参考之前提供的财务相关表格
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-money-bill-wave me-2"></i>收入分配
+                        </div>
+                        <div class="feature-desc">
+                            项目收入的具体分配标准管理
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 人事端 -->
+        <div class="module-card animate__animated animate__fadeInUp animate__delay-4s">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-user-friends"></i>人事端</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-tachometer-alt me-2"></i>人事看板
+                        </div>
+                        <div class="feature-desc">
+                            人事工作的中心控制面板
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-users me-2"></i>员工信息管理
+                        </div>
+                        <div class="feature-desc">
+                            包含身份证号、银行卡号、联系电话等详细信息
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-clock me-2"></i>考勤统计
+                        </div>
+                        <div class="feature-desc">
+                            区分劳动关系和劳务关系的不同考勤管理模式
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-low">
+                        <div class="feature-title">
+                            <i class="fas fa-laptop me-2"></i>资产管理
+                        </div>
+                        <div class="feature-desc">
+                            公司设备和资产的管理系统
+                        </div>
+                    </div>
+                </div>
+
+                <div class="sub-section">
+                    <h5><i class="fas fa-briefcase me-2"></i>不同员工类型管理</h5>
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="feature-item">
+                                <div class="feature-title">劳动关系(全职)</div>
+                                <div class="feature-desc">
+                                    每日上班严格管理,标准考勤制度
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="feature-item">
+                                <div class="feature-title">劳务关系(外包)</div>
+                                <div class="feature-desc">
+                                    • 标记是否可以接单<br>
+                                    • 工作状态评定<br>
+                                    • 能力技能评估<br>
+                                    • 项目质量评价
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 系统管理员 -->
+        <div class="module-card animate__animated animate__fadeInUp animate__delay-5s">
+            <div class="module-header" onclick="toggleModule(this)">
+                <h3><i class="fas fa-cogs"></i>系统管理员</h3>
+                <i class="fas fa-chevron-down toggle-icon"></i>
+            </div>
+            <div class="module-content">
+                <div class="feature-grid">
+                    <div class="feature-item priority-high">
+                        <div class="feature-title">
+                            <i class="fas fa-chart-pie me-2"></i>总览看板
+                        </div>
+                        <div class="feature-desc">
+                            整体项目、员工、客户统计和收入增长趋势
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-tasks me-2"></i>项目管理
+                        </div>
+                        <div class="feature-desc">
+                            列表形式,可复用在各端
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-user-cog me-2"></i>设计师管理
+                        </div>
+                        <div class="feature-desc">
+                            身份管理、所属组长、项目组管理
+                        </div>
+                    </div>
+                    
+                    <div class="feature-item priority-medium">
+                        <div class="feature-title">
+                            <i class="fas fa-user-tag me-2"></i>客户管理
+                        </div>
+                        <div class="feature-desc">
+                            复用客服端详细的客户详情页面
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        function toggleModule(header) {
+            const content = header.nextElementSibling;
+            const icon = header.querySelector('.toggle-icon');
+            
+            content.classList.toggle('active');
+            icon.classList.toggle('rotated');
+        }
+
+        // 初始化第一个模块展开
+        document.addEventListener('DOMContentLoaded', function() {
+            const firstModule = document.querySelector('.module-card .module-content');
+            const firstIcon = document.querySelector('.module-card .toggle-icon');
+            
+            if (firstModule && firstIcon) {
+                firstModule.classList.add('active');
+                firstIcon.classList.add('rotated');
+            }
+
+            // 统计数字动画
+            animateNumbers();
+        });
+
+        function animateNumbers() {
+            const numbers = document.querySelectorAll('.stat-number');
+            numbers.forEach(num => {
+                const finalNumber = parseInt(num.textContent);
+                let currentNumber = 0;
+                const increment = finalNumber / 50;
+                
+                const timer = setInterval(() => {
+                    currentNumber += increment;
+                    if (currentNumber >= finalNumber) {
+                        num.textContent = finalNumber + (num.textContent.includes('+') ? '+' : '');
+                        clearInterval(timer);
+                    } else {
+                        num.textContent = Math.floor(currentNumber);
+                    }
+                }, 40);
+            });
+        }
+    </script>
+</body>
+</html>

+ 780 - 0
docs/report/20250915/roadmap.html

@@ -0,0 +1,780 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>产品路线图 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+            --info-color: #17a2b8;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .roadmap-container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .timeline-roadmap {
+            position: relative;
+            margin: 40px 0;
+        }
+
+        .timeline-roadmap::before {
+            content: '';
+            position: absolute;
+            left: 50%;
+            top: 0;
+            bottom: 0;
+            width: 4px;
+            background: linear-gradient(to bottom, var(--primary-color), var(--secondary-color), var(--success-color));
+            transform: translateX(-50%);
+        }
+
+        .phase-item {
+            position: relative;
+            margin: 60px 0;
+            opacity: 0;
+            animation: fadeInUp 0.8s ease forwards;
+        }
+
+        .phase-item:nth-child(odd) {
+            text-align: right;
+            padding-right: calc(50% + 40px);
+        }
+
+        .phase-item:nth-child(even) {
+            text-align: left;
+            padding-left: calc(50% + 40px);
+        }
+
+        .phase-node {
+            position: absolute;
+            left: 50%;
+            top: 30px;
+            width: 80px;
+            height: 80px;
+            background: var(--primary-color);
+            border-radius: 50%;
+            transform: translateX(-50%);
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 2rem;
+            color: white;
+            z-index: 2;
+            box-shadow: 0 0 30px rgba(0, 212, 255, 0.6);
+            border: 4px solid var(--dark-bg);
+        }
+
+        .phase-content {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 20px;
+            padding: 30px;
+            position: relative;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+            transition: all 0.3s ease;
+        }
+
+        .phase-content:hover {
+            transform: translateY(-10px);
+            box-shadow: 0 20px 40px rgba(0, 212, 255, 0.2);
+            border-color: var(--primary-color);
+        }
+
+        .phase-item:nth-child(odd) .phase-content::after {
+            content: '';
+            position: absolute;
+            right: -20px;
+            top: 35px;
+            width: 0;
+            height: 0;
+            border: 20px solid transparent;
+            border-left-color: rgba(26, 26, 26, 0.9);
+        }
+
+        .phase-item:nth-child(even) .phase-content::after {
+            content: '';
+            position: absolute;
+            left: -20px;
+            top: 35px;
+            width: 0;
+            height: 0;
+            border: 20px solid transparent;
+            border-right-color: rgba(26, 26, 26, 0.9);
+        }
+
+        .phase-title {
+            font-size: 1.8rem;
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 10px;
+            display: flex;
+            align-items: center;
+        }
+
+        .phase-duration {
+            background: var(--info-color);
+            color: white;
+            padding: 5px 15px;
+            border-radius: 20px;
+            font-size: 0.9rem;
+            margin-left: 15px;
+        }
+
+        .phase-description {
+            color: var(--text-secondary);
+            margin-bottom: 20px;
+            line-height: 1.6;
+        }
+
+        .features-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 15px;
+        }
+
+        .feature-item {
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 8px;
+            padding: 15px;
+            border-left: 4px solid var(--primary-color);
+            transition: all 0.3s ease;
+        }
+
+        .feature-item:hover {
+            background: rgba(0, 212, 255, 0.2);
+            transform: translateX(5px);
+        }
+
+        .feature-title {
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 8px;
+            font-size: 0.95rem;
+        }
+
+        .feature-desc {
+            color: var(--text-secondary);
+            font-size: 0.85rem;
+        }
+
+        .priority-indicators {
+            display: flex;
+            gap: 10px;
+            margin: 15px 0;
+            flex-wrap: wrap;
+        }
+
+        .priority-badge {
+            padding: 5px 12px;
+            border-radius: 15px;
+            font-size: 0.8rem;
+            font-weight: bold;
+        }
+
+        .priority-critical {
+            background: var(--danger-color);
+            color: white;
+        }
+
+        .priority-high {
+            background: var(--warning-color);
+            color: #000;
+        }
+
+        .priority-medium {
+            background: var(--info-color);
+            color: white;
+        }
+
+        .priority-low {
+            background: var(--success-color);
+            color: white;
+        }
+
+        .resources-needed {
+            background: rgba(255, 193, 7, 0.1);
+            border-radius: 10px;
+            padding: 15px;
+            margin: 20px 0;
+            border-left: 4px solid var(--warning-color);
+        }
+
+        .resources-title {
+            font-weight: bold;
+            color: var(--warning-color);
+            margin-bottom: 10px;
+        }
+
+        .resources-list {
+            list-style: none;
+            padding: 0;
+        }
+
+        .resources-list li {
+            padding: 3px 0;
+            position: relative;
+            padding-left: 20px;
+        }
+
+        .resources-list li::before {
+            content: '👥';
+            position: absolute;
+            left: 0;
+        }
+
+        .milestone-summary {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            padding: 30px;
+            margin: 40px 0;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+        }
+
+        .summary-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+        }
+
+        .summary-item {
+            text-align: center;
+            padding: 20px;
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 10px;
+        }
+
+        .summary-number {
+            font-size: 2.5rem;
+            font-weight: bold;
+            color: var(--primary-color);
+            display: block;
+            margin-bottom: 10px;
+        }
+
+        .summary-label {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        @keyframes fadeInUp {
+            from {
+                opacity: 0;
+                transform: translateY(50px);
+            }
+            to {
+                opacity: 1;
+                transform: translateY(0);
+            }
+        }
+
+        @media (max-width: 768px) {
+            .timeline-roadmap::before {
+                left: 30px;
+            }
+            
+            .phase-item {
+                text-align: left !important;
+                padding-left: 70px !important;
+                padding-right: 0 !important;
+            }
+            
+            .phase-node {
+                left: 30px !important;
+                transform: none !important;
+                width: 60px;
+                height: 60px;
+                font-size: 1.5rem;
+            }
+            
+            .phase-content::after {
+                display: none !important;
+            }
+            
+            .phase-title {
+                font-size: 1.5rem;
+                flex-direction: column;
+                align-items: flex-start;
+            }
+            
+            .phase-duration {
+                margin-left: 0;
+                margin-top: 10px;
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html" style="color: var(--primary-color); text-decoration: none;">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active" style="color: var(--text-secondary);">产品路线图</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-road me-2"></i>产品路线图
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="roadmap-container">
+        <!-- 路线图概述 -->
+        <div class="milestone-summary animate__animated animate__fadeIn">
+            <h2 class="text-center mb-4">
+                <i class="fas fa-map-marked-alt me-2"></i>开发路线图概述
+            </h2>
+            <p class="text-center text-secondary mb-4">
+                基于会议讨论的功能优先级和开发时间线,制定为期12个月的产品开发计划
+            </p>
+            <div class="summary-grid">
+                <div class="summary-item">
+                    <span class="summary-number">4</span>
+                    <div class="summary-label">开发阶段</div>
+                </div>
+                <div class="summary-item">
+                    <span class="summary-number">4</span>
+                    <div class="summary-label">周开发周期</div>
+                </div>
+                <div class="summary-item">
+                    <span class="summary-number">25+</span>
+                    <div class="summary-label">核心功能</div>
+                </div>
+                <div class="summary-item">
+                    <span class="summary-number">6</span>
+                    <div class="summary-label">业务端口</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 开发时间线 -->
+        <div class="timeline-roadmap">
+            <!-- 第一阶段:基础架构与核心功能 -->
+            <div class="phase-item" style="animation-delay: 0.2s;">
+                <div class="phase-node">
+                    <i class="fas fa-rocket"></i>
+                </div>
+                <div class="phase-content">
+                    <div class="phase-title">
+                        第一阶段:基础架构与核心功能
+                        <span class="phase-duration">1周</span>
+                    </div>
+                    <div class="phase-description">
+                        建立系统基础架构,实现各端核心功能,确保基本业务流程的数字化运行。
+                    </div>
+
+                    <div class="priority-indicators">
+                        <span class="priority-badge priority-critical">关键路径</span>
+                        <span class="priority-badge priority-high">高优先级</span>
+                    </div>
+
+                    <div class="features-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">客服端基础功能</div>
+                            <div class="feature-desc">工作台、客户咨询、订单分配</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">设计师工作台</div>
+                            <div class="feature-desc">项目列表、代办事项、休息管理</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">组长管理面板</div>
+                            <div class="feature-desc">项目总览、异常监控、人员管理</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">统一项目详情</div>
+                            <div class="feature-desc">全局项目详情页面,支持各端访问</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">企业微信集成</div>
+                            <div class="feature-desc">信息同步,聊天窗口跳转</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">小程序对接</div>
+                            <div class="feature-desc">自动同步项目和客户信息</div>
+                        </div>
+                    </div>
+
+                    <div class="resources-needed">
+                        <div class="resources-title">
+                            <i class="fas fa-users me-2"></i>所需资源
+                        </div>
+                        <ul class="resources-list">
+                            <li>前端开发工程师 2名</li>
+                            <li>后端开发工程师 2名</li>
+                            <li>UI/UX设计师 1名</li>
+                            <li>项目经理 1名</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 第二阶段:流程优化与智能化 -->
+            <div class="phase-item" style="animation-delay: 0.4s;">
+                <div class="phase-node">
+                    <i class="fas fa-brain"></i>
+                </div>
+                <div class="phase-content">
+                    <div class="phase-title">
+                        第二阶段:流程优化与智能化
+                        <span class="phase-duration">2周</span>
+                    </div>
+                    <div class="phase-description">
+                        在基础功能基础上,加入智能化元素,优化用户体验,提升工作效率。
+                    </div>
+
+                    <div class="priority-indicators">
+                        <span class="priority-badge priority-high">高优先级</span>
+                        <span class="priority-badge priority-medium">智能化</span>
+                    </div>
+
+                    <div class="features-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">智能提醒系统</div>
+                            <div class="feature-desc">敏感词识别、紧急项目提醒</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">财务管理优化</div>
+                            <div class="feature-desc">自动对账、收入分配、成本统计</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">人事管理系统</div>
+                            <div class="feature-desc">员工档案、考勤统计、绩效评估</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">案例库功能</div>
+                            <div class="feature-desc">案例分享、统计分析、关键词搜索</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">质量管理体系</div>
+                            <div class="feature-desc">SOP数据统计、质量评估工具</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">移动端优化</div>
+                            <div class="feature-desc">响应式设计、移动端操作友好</div>
+                        </div>
+                    </div>
+
+                    <div class="resources-needed">
+                        <div class="resources-title">
+                            <i class="fas fa-users me-2"></i>所需资源
+                        </div>
+                        <ul class="resources-list">
+                            <li>AI算法工程师 1名</li>
+                            <li>数据分析师 1名</li>
+                            <li>前端开发工程师 1名</li>
+                            <li>测试工程师 1名</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 第三阶段:数据驱动与分析 -->
+            <div class="phase-item" style="animation-delay: 0.6s;">
+                <div class="phase-node">
+                    <i class="fas fa-chart-line"></i>
+                </div>
+                <div class="phase-content">
+                    <div class="phase-title">
+                        第三阶段:数据驱动与分析
+                        <span class="phase-duration">3周</span>
+                    </div>
+                    <div class="phase-description">
+                        建立完整的数据分析体系,提供决策支持,实现业务数据化管理。
+                    </div>
+
+                    <div class="priority-indicators">
+                        <span class="priority-badge priority-medium">中优先级</span>
+                        <span class="priority-badge priority-low">数据分析</span>
+                    </div>
+
+                    <div class="features-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">综合数据看板</div>
+                            <div class="feature-desc">项目、员工、客户、收入统计</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">效果图评估工具</div>
+                            <div class="feature-desc">AI辅助评估、质量打分系统</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">工作量评估系统</div>
+                            <div class="feature-desc">需求分析、工时预测、资源分配</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">客户行为分析</div>
+                            <div class="feature-desc">访问统计、偏好分析、转化跟踪</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">预测性分析</div>
+                            <div class="feature-desc">项目延期预警、人力需求预测</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">绩效分析系统</div>
+                            <div class="feature-desc">721绩效体系、多维度评估</div>
+                        </div>
+                    </div>
+
+                    <div class="resources-needed">
+                        <div class="resources-title">
+                            <i class="fas fa-users me-2"></i>所需资源
+                        </div>
+                        <ul class="resources-list">
+                            <li>数据工程师 1名</li>
+                            <li>商业分析师 1名</li>
+                            <li>机器学习工程师 1名</li>
+                            <li>数据可视化设计师 1名</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 第四阶段:AI集成与未来规划 -->
+            <div class="phase-item" style="animation-delay: 0.8s;">
+                <div class="phase-node">
+                    <i class="fas fa-robot"></i>
+                </div>
+                <div class="phase-content">
+                    <div class="phase-title">
+                        第四阶段:AI集成与未来规划
+                        <span class="phase-duration">4周</span>
+                    </div>
+                    <div class="phase-description">
+                        集成AI技术,探索未来业务模式,为公司长期发展奠定技术基础。
+                    </div>
+
+                    <div class="priority-indicators">
+                        <span class="priority-badge priority-medium">中优先级</span>
+                        <span class="priority-badge priority-low">前瞻性</span>
+                    </div>
+
+                    <div class="features-grid">
+                        <div class="feature-item">
+                            <div class="feature-title">AI辅助建模</div>
+                            <div class="feature-desc">自动建模工具、智能优化建议</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">智能渲染优化</div>
+                            <div class="feature-desc">参数自动调节、质量智能评估</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">客服AI助手</div>
+                            <div class="feature-desc">智能回复、需求理解、方案推荐</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">项目智能调度</div>
+                            <div class="feature-desc">资源优化分配、时间智能规划</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">双轨制业务模式</div>
+                            <div class="feature-desc">AI快速出图 + 精品定制服务</div>
+                        </div>
+                        <div class="feature-item">
+                            <div class="feature-title">开放API平台</div>
+                            <div class="feature-desc">第三方集成、生态系统建设</div>
+                        </div>
+                    </div>
+
+                    <div class="resources-needed">
+                        <div class="resources-title">
+                            <i class="fas fa-users me-2"></i>所需资源
+                        </div>
+                        <ul class="resources-list">
+                            <li>AI研发工程师 2名</li>
+                            <li>算法优化专家 1名</li>
+                            <li>产品规划师 1名</li>
+                            <li>技术架构师 1名</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 风险评估与应对策略 -->
+        <div class="milestone-summary animate__animated animate__fadeIn animate__delay-1s">
+            <h3 class="text-center mb-4">
+                <i class="fas fa-shield-alt me-2"></i>风险评估与应对策略
+            </h3>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="feature-item" style="border-left-color: var(--danger-color);">
+                        <div class="feature-title" style="color: var(--danger-color);">
+                            <i class="fas fa-exclamation-triangle me-2"></i>技术风险
+                        </div>
+                        <div class="feature-desc">
+                            • AI技术成熟度不确定性<br>
+                            • 系统集成复杂度高<br>
+                            • 数据安全和隐私保护<br>
+                            <strong>应对:</strong>分阶段实施,建立备用方案
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-6">
+                    <div class="feature-item" style="border-left-color: var(--warning-color);">
+                        <div class="feature-title" style="color: var(--warning-color);">
+                            <i class="fas fa-users me-2"></i>人员风险
+                        </div>
+                        <div class="feature-desc">
+                            • 关键人员流失<br>
+                            • 新技术学习成本<br>
+                            • 变更管理阻力<br>
+                            <strong>应对:</strong>加强培训,建立激励机制
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row mt-3">
+                <div class="col-md-6">
+                    <div class="feature-item" style="border-left-color: var(--info-color);">
+                        <div class="feature-title" style="color: var(--info-color);">
+                            <i class="fas fa-dollar-sign me-2"></i>预算风险
+                        </div>
+                        <div class="feature-desc">
+                            • 开发成本超预算<br>
+                            • 硬件设备投入<br>
+                            • 第三方服务费用<br>
+                            <strong>应对:</strong>制定详细预算,设置缓冲资金
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-6">
+                    <div class="feature-item" style="border-left-color: var(--success-color);">
+                        <div class="feature-title" style="color: var(--success-color);">
+                            <i class="fas fa-clock me-2"></i>时间风险
+                        </div>
+                        <div class="feature-desc">
+                            • 功能开发延期<br>
+                            • 测试时间不足<br>
+                            • 上线时间推迟<br>
+                            <strong>应对:</strong>敏捷开发,MVP先行
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 滚动触发动画
+        function animateOnScroll() {
+            const phases = document.querySelectorAll('.phase-item');
+            
+            phases.forEach(phase => {
+                const rect = phase.getBoundingClientRect();
+                const isVisible = rect.top < window.innerHeight * 0.8;
+                
+                if (isVisible && !phase.classList.contains('animated')) {
+                    phase.style.opacity = '1';
+                    phase.classList.add('animated');
+                }
+            });
+        }
+
+        // 页面加载和滚动时触发动画
+        window.addEventListener('scroll', animateOnScroll);
+        window.addEventListener('load', animateOnScroll);
+
+        // 数字动画
+        document.addEventListener('DOMContentLoaded', function() {
+            const numbers = document.querySelectorAll('.summary-number');
+            numbers.forEach(num => {
+                const text = num.textContent;
+                const hasPlus = text.includes('+');
+                const finalNumber = parseInt(text);
+                
+                if (!isNaN(finalNumber)) {
+                    let current = 0;
+                    const increment = finalNumber / 30;
+                    
+                    const timer = setInterval(() => {
+                        current += increment;
+                        if (current >= finalNumber) {
+                            num.textContent = finalNumber + (hasPlus ? '+' : '');
+                            clearInterval(timer);
+                        } else {
+                            num.textContent = Math.floor(current) + (hasPlus ? '+' : '');
+                        }
+                    }, 50);
+                }
+            });
+
+            // 初始触发滚动检查
+            setTimeout(animateOnScroll, 500);
+        });
+
+        // 阶段节点悬停效果
+        document.querySelectorAll('.phase-node').forEach(node => {
+            node.addEventListener('mouseenter', function() {
+                this.style.transform = 'translateX(-50%) scale(1.2)';
+                this.style.boxShadow = '0 0 50px rgba(0, 212, 255, 0.8)';
+            });
+            
+            node.addEventListener('mouseleave', function() {
+                this.style.transform = 'translateX(-50%) scale(1)';
+                this.style.boxShadow = '0 0 30px rgba(0, 212, 255, 0.6)';
+            });
+        });
+
+        // 功能项动画效果
+        document.querySelectorAll('.feature-item').forEach(item => {
+            item.addEventListener('mouseenter', function() {
+                this.style.transform = 'translateX(10px)';
+            });
+            
+            item.addEventListener('mouseleave', function() {
+                this.style.transform = 'translateX(5px)';
+            });
+        });
+    </script>
+</body>
+</html>

+ 776 - 0
docs/report/20250915/tasks.html

@@ -0,0 +1,776 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>本周待办事项 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+            --info-color: #17a2b8;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .breadcrumb {
+            background: transparent;
+            margin-bottom: 0;
+        }
+
+        .breadcrumb-item a {
+            color: var(--primary-color);
+            text-decoration: none;
+        }
+
+        .tasks-container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .task-category {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            margin-bottom: 30px;
+            overflow: hidden;
+            border: 1px solid rgba(0, 212, 255, 0.2);
+            transition: all 0.3s ease;
+        }
+
+        .task-category:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 30px rgba(0, 212, 255, 0.1);
+            border-color: var(--primary-color);
+        }
+
+        .category-header {
+            background: linear-gradient(135deg, var(--primary-color) 0%, #667eea 100%);
+            color: white;
+            padding: 20px 30px;
+            display: flex;
+            justify-content: between;
+            align-items: center;
+        }
+
+        .category-header h3 {
+            margin: 0;
+            font-size: 1.5rem;
+            display: flex;
+            align-items: center;
+            flex: 1;
+        }
+
+        .category-header i {
+            margin-right: 10px;
+        }
+
+        .priority-badge {
+            padding: 5px 12px;
+            border-radius: 20px;
+            font-size: 0.8rem;
+            font-weight: bold;
+        }
+
+        .priority-high {
+            background: var(--danger-color);
+            color: white;
+        }
+
+        .priority-medium {
+            background: var(--warning-color);
+            color: #000;
+        }
+
+        .priority-low {
+            background: var(--success-color);
+            color: white;
+        }
+
+        .category-content {
+            padding: 30px;
+        }
+
+        .task-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+            gap: 20px;
+        }
+
+        .task-item {
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 10px;
+            padding: 20px;
+            border-left: 4px solid var(--primary-color);
+            transition: all 0.3s ease;
+            position: relative;
+        }
+
+        .task-item:hover {
+            background: rgba(0, 212, 255, 0.2);
+            transform: translateX(5px);
+        }
+
+        .task-title {
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 10px;
+            display: flex;
+            justify-content: between;
+            align-items: center;
+        }
+
+        .task-desc {
+            color: var(--text-secondary);
+            line-height: 1.6;
+            margin-bottom: 15px;
+        }
+
+        .task-details {
+            background: rgba(0, 0, 0, 0.3);
+            border-radius: 8px;
+            padding: 15px;
+            margin: 15px 0;
+        }
+
+        .task-details h6 {
+            color: var(--secondary-color);
+            margin-bottom: 10px;
+        }
+
+        .task-list {
+            list-style: none;
+            padding: 0;
+        }
+
+        .task-list li {
+            padding: 8px 0;
+            border-bottom: 1px solid rgba(0, 212, 255, 0.2);
+            position: relative;
+            padding-left: 25px;
+        }
+
+        .task-list li:last-child {
+            border-bottom: none;
+        }
+
+        .task-list li::before {
+            content: '•';
+            position: absolute;
+            left: 0;
+            color: var(--primary-color);
+            font-weight: bold;
+            font-size: 1.2rem;
+        }
+
+        .deadline {
+            background: var(--danger-color);
+            color: white;
+            padding: 3px 8px;
+            border-radius: 12px;
+            font-size: 0.75rem;
+            margin-left: 10px;
+        }
+
+        .progress-container {
+            margin: 20px 0;
+        }
+
+        .progress-bar-custom {
+            background: rgba(0, 212, 255, 0.2);
+            height: 8px;
+            border-radius: 4px;
+            overflow: hidden;
+            position: relative;
+        }
+
+        .progress-fill {
+            height: 100%;
+            background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
+            border-radius: 4px;
+            transition: width 1s ease;
+        }
+
+        .progress-text {
+            font-size: 0.9rem;
+            color: var(--text-secondary);
+            margin-top: 5px;
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        .stats-overview {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+            margin-bottom: 40px;
+        }
+
+        .stat-card {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 10px;
+            padding: 25px;
+            text-align: center;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+            transition: all 0.3s ease;
+        }
+
+        .stat-card:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 10px 25px rgba(0, 212, 255, 0.2);
+        }
+
+        .stat-number {
+            font-size: 2.5rem;
+            font-weight: bold;
+            background: linear-gradient(45deg, var(--primary-color), #667eea);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            display: block;
+            margin-bottom: 10px;
+        }
+
+        .stat-label {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .timeline-marker {
+            position: absolute;
+            right: 15px;
+            top: 15px;
+            width: 12px;
+            height: 12px;
+            border-radius: 50%;
+            background: var(--warning-color);
+        }
+
+        .timeline-marker.completed {
+            background: var(--success-color);
+        }
+
+        .timeline-marker.urgent {
+            background: var(--danger-color);
+            animation: pulse 2s infinite;
+        }
+
+        @keyframes pulse {
+            0%, 100% { opacity: 1; }
+            50% { opacity: 0.5; }
+        }
+
+        .responsible-person {
+            background: rgba(102, 126, 234, 0.1);
+            color: #667eea;
+            padding: 3px 8px;
+            border-radius: 12px;
+            font-size: 0.75rem;
+            margin-left: auto;
+        }
+
+        @media (max-width: 768px) {
+            .tasks-container {
+                padding: 20px 10px;
+            }
+            
+            .category-header {
+                padding: 15px 20px;
+                flex-direction: column;
+                gap: 10px;
+            }
+            
+            .category-content {
+                padding: 20px;
+            }
+            
+            .task-grid {
+                grid-template-columns: 1fr;
+            }
+            
+            .stats-overview {
+                grid-template-columns: repeat(2, 1fr);
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active">本周待办事项</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-tasks me-2"></i>本周待办事项
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="tasks-container">
+        <!-- 统计概览 -->
+        <div class="stats-overview animate__animated animate__fadeIn">
+            <div class="stat-card">
+                <span class="stat-number">3</span>
+                <div class="stat-label">主要类别</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">20+</span>
+                <div class="stat-label">待办事项</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">7</span>
+                <div class="stat-label">天期限</div>
+            </div>
+            <div class="stat-card">
+                <span class="stat-number">85%</span>
+                <div class="stat-label">完成进度</div>
+            </div>
+        </div>
+
+        <!-- 项目流程评估标准 -->
+        <div class="task-category animate__animated animate__fadeInUp">
+            <div class="category-header">
+                <h3><i class="fas fa-clipboard-check"></i>项目流程评估标准</h3>
+                <span class="priority-badge priority-high">高优先级</span>
+            </div>
+            <div class="category-content">
+                <div class="progress-container">
+                    <div class="progress-bar-custom">
+                        <div class="progress-fill" style="width: 60%"></div>
+                    </div>
+                    <div class="progress-text">整体进度: 60% 完成</div>
+                </div>
+
+                <div class="task-grid">
+                    <div class="task-item">
+                        <div class="timeline-marker urgent"></div>
+                        <div class="task-title">
+                            需求确认评价维度
+                            <span class="deadline">本周四</span>
+                        </div>
+                        <div class="task-desc">
+                            制定客户下单时需求确认的评价维度和具体要求标准
+                        </div>
+                        <div class="task-details">
+                            <h6>具体要求:</h6>
+                            <ul class="task-list">
+                                <li>基础信息完整性检查标准</li>
+                                <li>扩展需求补充评判标准</li>
+                                <li>需求可执行性评估方法</li>
+                                <li>时间节点合理性判断</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 项目组长</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker urgent"></div>
+                        <div class="task-title">
+                            建模阶段评价标准
+                            <span class="deadline">本周五</span>
+                        </div>
+                        <div class="task-desc">
+                            定义建模阶段的质量评价维度和验收要求
+                        </div>
+                        <div class="task-details">
+                            <h6>评价维度:</h6>
+                            <ul class="task-list">
+                                <li>空间准确性:尺寸比例符合CAD</li>
+                                <li>结构完整性:造型结构合理</li>
+                                <li>形状准确性:细节形状到位</li>
+                                <li>优化程度:便于后续处理</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 技术负责人</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker urgent"></div>
+                        <div class="task-title">
+                            渲染质量评价标准
+                            <span class="deadline">本周五</span>
+                        </div>
+                        <div class="task-desc">
+                            建立小图和大图渲染的质量评价体系
+                        </div>
+                        <div class="task-details">
+                            <h6>小图评价:</h6>
+                            <ul class="task-list">
+                                <li>氛围效果:灯光氛围是否到位</li>
+                                <li>细节表现:材质细节是否精致</li>
+                                <li>软装效果:摆放选品调性统一</li>
+                            </ul>
+                            <h6>大图评价:</h6>
+                            <ul class="task-list">
+                                <li>分辨率标准:4000像素以上</li>
+                                <li>细节清晰度:放大后清楚可见</li>
+                                <li>打印适用性:满足工地需求</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 质量主管</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            效果图综合评估
+                            <span class="deadline">本周三</span>
+                        </div>
+                        <div class="task-desc">
+                            建立基于原始需求、效果图、评审维度的综合评估体系
+                        </div>
+                        <div class="task-details">
+                            <h6>评估案例:</h6>
+                            <ul class="task-list">
+                                <li>收集典型项目案例</li>
+                                <li>分析原始需求与最终效果</li>
+                                <li>建立评审维度模板</li>
+                                <li>制定评分标准</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 项目经理</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 财务核心流程补充 -->
+        <div class="task-category animate__animated animate__fadeInUp animate__delay-1s">
+            <div class="category-header">
+                <h3><i class="fas fa-calculator"></i>财务核心流程补充</h3>
+                <span class="priority-badge priority-high">高优先级</span>
+            </div>
+            <div class="category-content">
+                <div class="progress-container">
+                    <div class="progress-bar-custom">
+                        <div class="progress-fill" style="width: 45%"></div>
+                    </div>
+                    <div class="progress-text">整体进度: 45% 完成</div>
+                </div>
+
+                <div class="task-grid">
+                    <div class="task-item">
+                        <div class="timeline-marker urgent"></div>
+                        <div class="task-title">
+                            项目收入分配标准
+                            <span class="deadline">本周三</span>
+                        </div>
+                        <div class="task-desc">
+                            制定项目收入的具体分配标准和计算方法
+                        </div>
+                        <div class="task-details">
+                            <h6>分配维度:</h6>
+                            <ul class="task-list">
+                                <li>收入:项目总收入计算</li>
+                                <li>毛利:扣除直接成本后利润</li>
+                                <li>成本:人工、素材、设备成本</li>
+                                <li>分成:设计师、组长、公司分成比例</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 财务经理</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker urgent"></div>
+                        <div class="task-title">
+                            月度成本均摊方案
+                            <span class="deadline">本周四</span>
+                        </div>
+                        <div class="task-desc">
+                            建立整体月度成本均摊体系,特别是素材库成本分摊
+                        </div>
+                        <div class="task-details">
+                            <h6>成本类别:</h6>
+                            <ul class="task-list">
+                                <li>素材库每月消费统计</li>
+                                <li>按项目数量分摊方法</li>
+                                <li>按设计师使用量分摊</li>
+                                <li>固定成本均摊方案</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 财务主管</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            付款对账优化
+                            <span class="deadline">本周四</span>
+                        </div>
+                        <div class="task-desc">
+                            优化项目财务管理信息上传流程,参考之前财务表格
+                        </div>
+                        <div class="task-details">
+                            <h6>优化重点:</h6>
+                            <ul class="task-list">
+                                <li>简化客服上传流程</li>
+                                <li>自动化对账功能</li>
+                                <li>异常提醒机制</li>
+                                <li>报表生成优化</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 系统开发</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 人事招聘评判维度 -->
+        <div class="task-category animate__animated animate__fadeInUp animate__delay-2s">
+            <div class="category-header">
+                <h3><i class="fas fa-user-friends"></i>人事招聘评判维度</h3>
+                <span class="priority-badge priority-medium">中优先级</span>
+            </div>
+            <div class="category-content">
+                <div class="progress-container">
+                    <div class="progress-bar-custom">
+                        <div class="progress-fill" style="width: 30%"></div>
+                    </div>
+                    <div class="progress-text">整体进度: 30% 完成</div>
+                </div>
+
+                <div class="task-grid">
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            简历初筛标准
+                            <span class="deadline">本周三</span>
+                        </div>
+                        <div class="task-desc">
+                            建立简历初筛的评判标准和反馈记录要求
+                        </div>
+                        <div class="task-details">
+                            <h6>筛选维度:</h6>
+                            <ul class="task-list">
+                                <li>技能匹配度评估</li>
+                                <li>经验年限要求</li>
+                                <li>作品质量评判</li>
+                                <li>学历背景权重</li>
+                                <li>反馈信息记录模板</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 人事经理</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            入职评定标准
+                            <span class="deadline">本周四</span>
+                        </div>
+                        <div class="task-desc">
+                            制定达到入职要求的具体评价标准
+                        </div>
+                        <div class="task-details">
+                            <h6>评定要素:</h6>
+                            <ul class="task-list">
+                                <li>技能测试合格线</li>
+                                <li>团队协作能力</li>
+                                <li>学习能力评估</li>
+                                <li>责任心和态度</li>
+                                <li>试用期表现标准</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 技术主管</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            晋升因素分析
+                            <span class="deadline">本周五</span>
+                        </div>
+                        <div class="task-desc">
+                            总结晋升常见因素和评判标准
+                        </div>
+                        <div class="task-details">
+                            <h6>晋升维度:</h6>
+                            <ul class="task-list">
+                                <li>项目完成质量</li>
+                                <li>客户满意度</li>
+                                <li>团队贡献度</li>
+                                <li>创新能力表现</li>
+                                <li>领导力潜质</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 部门经理</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            离职原因档案
+                            <span class="deadline">本周五</span>
+                        </div>
+                        <div class="task-desc">
+                            建立离职原因档案,区分不同能力和场景
+                        </div>
+                        <div class="task-details">
+                            <h6>分类统计:</h6>
+                            <ul class="task-list">
+                                <li>新人离职:面聊问题总结</li>
+                                <li>有经验者:深层原因分析</li>
+                                <li>客户冲突:处理方式改进</li>
+                                <li>方案认可:能力提升方案</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 人事专员</div>
+                    </div>
+
+                    <div class="task-item">
+                        <div class="timeline-marker"></div>
+                        <div class="task-title">
+                            数据整理表格
+                            <span class="deadline">本周三</span>
+                        </div>
+                        <div class="task-desc">
+                            整理人事常用数据表格并建立标准模板
+                        </div>
+                        <div class="task-details">
+                            <h6>表格类型:</h6>
+                            <ul class="task-list">
+                                <li>人员档案管理表</li>
+                                <li>客服绩效每日填报表</li>
+                                <li>企业微信聊天统计表</li>
+                                <li>主动对接客户统计表</li>
+                            </ul>
+                        </div>
+                        <div class="responsible-person">负责人: 数据分析师</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 动画初始化
+        document.addEventListener('DOMContentLoaded', function() {
+            // 统计数字动画
+            animateNumbers();
+            
+            // 进度条动画
+            animateProgressBars();
+            
+            // 标记动画
+            animateMarkers();
+        });
+
+        function animateNumbers() {
+            const numbers = document.querySelectorAll('.stat-number');
+            numbers.forEach(num => {
+                const text = num.textContent;
+                const hasPercent = text.includes('%');
+                const hasPlus = text.includes('+');
+                const finalNumber = parseInt(text);
+                
+                if (!isNaN(finalNumber)) {
+                    let current = 0;
+                    const increment = finalNumber / 50;
+                    
+                    const timer = setInterval(() => {
+                        current += increment;
+                        if (current >= finalNumber) {
+                            num.textContent = finalNumber + (hasPercent ? '%' : '') + (hasPlus ? '+' : '');
+                            clearInterval(timer);
+                        } else {
+                            num.textContent = Math.floor(current) + (hasPercent ? '%' : '') + (hasPlus ? '+' : '');
+                        }
+                    }, 40);
+                }
+            });
+        }
+
+        function animateProgressBars() {
+            const progressBars = document.querySelectorAll('.progress-fill');
+            progressBars.forEach((bar, index) => {
+                setTimeout(() => {
+                    const width = bar.style.width;
+                    bar.style.width = '0%';
+                    setTimeout(() => {
+                        bar.style.width = width;
+                    }, 100);
+                }, index * 500);
+            });
+        }
+
+        function animateMarkers() {
+            const markers = document.querySelectorAll('.timeline-marker');
+            markers.forEach((marker, index) => {
+                setTimeout(() => {
+                    marker.style.transform = 'scale(1.2)';
+                    setTimeout(() => {
+                        marker.style.transform = 'scale(1)';
+                    }, 200);
+                }, index * 200);
+            });
+        }
+
+        // 任务项悬停效果
+        document.querySelectorAll('.task-item').forEach(item => {
+            item.addEventListener('mouseenter', function() {
+                this.style.transform = 'translateX(10px) translateY(-5px)';
+            });
+            
+            item.addEventListener('mouseleave', function() {
+                this.style.transform = 'translateX(5px) translateY(0)';
+            });
+        });
+
+        // 滚动视差效果
+        window.addEventListener('scroll', function() {
+            const scrolled = window.pageYOffset;
+            const parallaxElements = document.querySelectorAll('.task-category');
+            
+            parallaxElements.forEach((element, index) => {
+                const speed = 0.1 + (index * 0.05);
+                const yPos = -(scrolled * speed);
+                element.style.transform = `translateY(${yPos}px)`;
+            });
+        });
+    </script>
+</body>
+</html>

+ 776 - 0
docs/report/20250915/workflow.html

@@ -0,0 +1,776 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>项目流程管控 - 映三色项目报告</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <style>
+        :root {
+            --primary-color: #00d4ff;
+            --secondary-color: #0099cc;
+            --dark-bg: #0a0a0a;
+            --card-bg: #1a1a1a;
+            --text-primary: #ffffff;
+            --text-secondary: #cccccc;
+            --success-color: #28a745;
+            --warning-color: #ffc107;
+            --danger-color: #dc3545;
+            --info-color: #17a2b8;
+        }
+
+        body {
+            background: var(--dark-bg);
+            color: var(--text-primary);
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .header {
+            background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
+            padding: 20px 0;
+            border-bottom: 2px solid var(--primary-color);
+        }
+
+        .breadcrumb {
+            background: transparent;
+            margin-bottom: 0;
+        }
+
+        .breadcrumb-item a {
+            color: var(--primary-color);
+            text-decoration: none;
+        }
+
+        .workflow-container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+
+        .timeline {
+            position: relative;
+            margin: 40px 0;
+        }
+
+        .timeline::before {
+            content: '';
+            position: absolute;
+            left: 50%;
+            top: 0;
+            bottom: 0;
+            width: 4px;
+            background: linear-gradient(to bottom, var(--primary-color), var(--secondary-color));
+            transform: translateX(-50%);
+        }
+
+        .timeline-item {
+            position: relative;
+            margin: 50px 0;
+            opacity: 0;
+            animation: fadeInUp 0.6s ease forwards;
+        }
+
+        .timeline-item:nth-child(odd) {
+            text-align: right;
+            padding-right: calc(50% + 30px);
+        }
+
+        .timeline-item:nth-child(even) {
+            text-align: left;
+            padding-left: calc(50% + 30px);
+        }
+
+        .timeline-node {
+            position: absolute;
+            left: 50%;
+            top: 20px;
+            width: 60px;
+            height: 60px;
+            background: var(--primary-color);
+            border-radius: 50%;
+            transform: translateX(-50%);
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 1.5rem;
+            color: white;
+            z-index: 2;
+            box-shadow: 0 0 20px rgba(0, 212, 255, 0.5);
+        }
+
+        .timeline-content {
+            background: rgba(26, 26, 26, 0.9);
+            border-radius: 15px;
+            padding: 30px;
+            position: relative;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+            transition: all 0.3s ease;
+        }
+
+        .timeline-content:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 30px rgba(0, 212, 255, 0.2);
+            border-color: var(--primary-color);
+        }
+
+        .timeline-item:nth-child(odd) .timeline-content::after {
+            content: '';
+            position: absolute;
+            right: -15px;
+            top: 25px;
+            width: 0;
+            height: 0;
+            border: 15px solid transparent;
+            border-left-color: rgba(26, 26, 26, 0.9);
+        }
+
+        .timeline-item:nth-child(even) .timeline-content::after {
+            content: '';
+            position: absolute;
+            left: -15px;
+            top: 25px;
+            width: 0;
+            height: 0;
+            border: 15px solid transparent;
+            border-right-color: rgba(26, 26, 26, 0.9);
+        }
+
+        .phase-title {
+            font-size: 1.8rem;
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 15px;
+            display: flex;
+            align-items: center;
+        }
+
+        .phase-title i {
+            margin-right: 10px;
+        }
+
+        .phase-description {
+            color: var(--text-secondary);
+            margin-bottom: 20px;
+            line-height: 1.6;
+        }
+
+        .requirements-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+            gap: 15px;
+            margin: 20px 0;
+        }
+
+        .requirement-item {
+            background: rgba(0, 212, 255, 0.1);
+            border-radius: 8px;
+            padding: 15px;
+            border-left: 4px solid var(--primary-color);
+        }
+
+        .requirement-title {
+            font-weight: bold;
+            color: var(--primary-color);
+            margin-bottom: 8px;
+        }
+
+        .requirement-desc {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .evaluation-criteria {
+            background: rgba(40, 167, 69, 0.1);
+            border-radius: 10px;
+            padding: 20px;
+            margin: 20px 0;
+            border: 1px solid var(--success-color);
+        }
+
+        .evaluation-title {
+            color: var(--success-color);
+            font-weight: bold;
+            margin-bottom: 10px;
+            display: flex;
+            align-items: center;
+        }
+
+        .evaluation-title i {
+            margin-right: 8px;
+        }
+
+        .criteria-list {
+            list-style: none;
+            padding: 0;
+        }
+
+        .criteria-list li {
+            padding: 5px 0;
+            color: var(--text-secondary);
+            position: relative;
+            padding-left: 20px;
+        }
+
+        .criteria-list li::before {
+            content: '✓';
+            position: absolute;
+            left: 0;
+            color: var(--success-color);
+            font-weight: bold;
+        }
+
+        .process-flow {
+            background: rgba(26, 26, 26, 0.8);
+            border-radius: 15px;
+            padding: 30px;
+            margin: 30px 0;
+            border: 1px solid rgba(0, 212, 255, 0.3);
+        }
+
+        .flow-steps {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            flex-wrap: wrap;
+            gap: 20px;
+        }
+
+        .flow-step {
+            flex: 1;
+            min-width: 200px;
+            text-align: center;
+            position: relative;
+        }
+
+        .flow-step:not(:last-child)::after {
+            content: '→';
+            position: absolute;
+            right: -20px;
+            top: 50%;
+            transform: translateY(-50%);
+            color: var(--primary-color);
+            font-size: 1.5rem;
+            font-weight: bold;
+        }
+
+        .step-icon {
+            width: 80px;
+            height: 80px;
+            background: var(--primary-color);
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            margin: 0 auto 15px;
+            font-size: 2rem;
+            color: white;
+        }
+
+        .step-title {
+            font-weight: bold;
+            margin-bottom: 10px;
+            color: var(--primary-color);
+        }
+
+        .step-desc {
+            color: var(--text-secondary);
+            font-size: 0.9rem;
+        }
+
+        .faq-section {
+            background: rgba(220, 53, 69, 0.1);
+            border-radius: 15px;
+            padding: 30px;
+            margin: 40px 0;
+            border: 1px solid var(--danger-color);
+        }
+
+        .faq-title {
+            color: var(--danger-color);
+            font-size: 1.5rem;
+            font-weight: bold;
+            margin-bottom: 20px;
+            display: flex;
+            align-items: center;
+        }
+
+        .faq-title i {
+            margin-right: 10px;
+        }
+
+        .back-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            border: none;
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            transition: all 0.3s ease;
+        }
+
+        .back-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
+            color: white;
+        }
+
+        @keyframes fadeInUp {
+            from {
+                opacity: 0;
+                transform: translateY(30px);
+            }
+            to {
+                opacity: 1;
+                transform: translateY(0);
+            }
+        }
+
+        @media (max-width: 768px) {
+            .timeline::before {
+                left: 30px;
+            }
+            
+            .timeline-item {
+                text-align: left !important;
+                padding-left: 60px !important;
+                padding-right: 0 !important;
+            }
+            
+            .timeline-node {
+                left: 30px !important;
+                transform: none !important;
+            }
+            
+            .timeline-content::after {
+                display: none;
+            }
+            
+            .flow-steps {
+                flex-direction: column;
+            }
+            
+            .flow-step:not(:last-child)::after {
+                content: '↓';
+                position: static;
+                margin: 10px 0;
+            }
+        }
+    </style>
+</head>
+<body>
+    <header class="header">
+        <div class="container">
+            <nav class="breadcrumb">
+                <a class="breadcrumb-item" href="index.html">
+                    <i class="fas fa-home me-2"></i>首页
+                </a>
+                <span class="breadcrumb-item active">项目流程管控</span>
+            </nav>
+            <div class="d-flex justify-content-between align-items-center mt-3">
+                <h1 class="mb-0">
+                    <i class="fas fa-project-diagram me-2"></i>项目流程管控
+                </h1>
+                <a href="index.html" class="back-btn">
+                    <i class="fas fa-arrow-left me-2"></i>返回首页
+                </a>
+            </div>
+        </div>
+    </header>
+
+    <div class="workflow-container">
+        <!-- 流程概览 -->
+        <div class="process-flow animate__animated animate__fadeIn">
+            <h2 class="text-center mb-4">
+                <i class="fas fa-sitemap me-2"></i>项目流程概览
+            </h2>
+            <div class="flow-steps">
+                <div class="flow-step">
+                    <div class="step-icon"><i class="fas fa-comments"></i></div>
+                    <div class="step-title">需求沟通</div>
+                    <div class="step-desc">客户需求收集与确认</div>
+                </div>
+                <div class="flow-step">
+                    <div class="step-icon"><i class="fas fa-cogs"></i></div>
+                    <div class="step-title">项目执行</div>
+                    <div class="step-desc">建模→软装→渲染→大图</div>
+                </div>
+                <div class="flow-step">
+                    <div class="step-icon"><i class="fas fa-check-circle"></i></div>
+                    <div class="step-title">项目收尾</div>
+                    <div class="step-desc">后期处理与交付</div>
+                </div>
+            </div>
+        </div>
+
+        <!-- 详细流程时间线 -->
+        <div class="timeline">
+            <!-- 需求沟通阶段 -->
+            <div class="timeline-item" style="animation-delay: 0.2s;">
+                <div class="timeline-node">
+                    <i class="fas fa-comments"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-handshake"></i>需求沟通阶段
+                    </div>
+                    <div class="phase-description">
+                        客户通过客服下单,收集和确认项目基础信息和扩展需求,建立项目群进行详细沟通。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">必备基础信息</div>
+                            <div class="requirement-desc">
+                                • 平面图<br>
+                                • 立面/天花图<br>
+                                • 参考图<br>
+                                • 作图标准<br>
+                                • 高端图/中端图<br>
+                                • 小图时间<br>
+                                • 风格要求
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">扩展需求补充</div>
+                            <div class="requirement-desc">
+                                • 大图时间<br>
+                                • 软装色彩参考图<br>
+                                • CAD立面/天花<br>
+                                • 细节形状与结构<br>
+                                • 氛围需求说明
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>信息完整性:必备信息是否齐全</li>
+                            <li>需求清晰度:客户需求是否明确表达</li>
+                            <li>可执行性:需求是否具备技术可行性</li>
+                            <li>时间合理性:交付时间是否现实可达</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 建模阶段 -->
+            <div class="timeline-item" style="animation-delay: 0.4s;">
+                <div class="timeline-node">
+                    <i class="fas fa-cube"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-drafting-compass"></i>建模阶段
+                    </div>
+                    <div class="phase-description">
+                        创建硬装模型,建立空间结构和基础造型,为后续软装和渲染奠定基础。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">建模要求</div>
+                            <div class="requirement-desc">
+                                • 按照CAD图纸建立精确模型<br>
+                                • 确保空间比例准确<br>
+                                • 建立基础材质框架<br>
+                                • 优化模型结构和面数
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">客户确认</div>
+                            <div class="requirement-desc">
+                                • 发送模型截图给客户<br>
+                                • 专业客户:需要深化确认<br>
+                                • 非专业客户:建议跳过确认<br>
+                                • 避免增加不必要的修改
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>空间准确性:尺寸和比例是否符合CAD</li>
+                            <li>结构完整性:造型和结构是否合理</li>
+                            <li>形状准确性:细节形状是否到位</li>
+                            <li>优化程度:模型是否便于后续处理</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 软装阶段 -->
+            <div class="timeline-item" style="animation-delay: 0.6s;">
+                <div class="timeline-node">
+                    <i class="fas fa-couch"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-palette"></i>软装阶段
+                    </div>
+                    <div class="phase-description">
+                        在硬装模型基础上添加家具、装饰品等软装元素,形成完整的空间设计方案。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">软装布置</div>
+                            <div class="requirement-desc">
+                                • 添加家具和装饰品<br>
+                                • 确定整体色彩搭配<br>
+                                • 调整空间布局合理性<br>
+                                • 营造设计氛围
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">截图确认</div>
+                            <div class="requirement-desc">
+                                • 发送软装框架截图<br>
+                                • 展示家具摆放效果<br>
+                                • 确认软装选品方向<br>
+                                • 调整客户反馈意见
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>搭配协调性:色彩和风格是否统一</li>
+                            <li>空间合理性:家具布局是否合理</li>
+                            <li>选品质量:家具和装饰品选择是否恰当</li>
+                            <li>氛围营造:是否达到预期设计效果</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 渲染阶段 -->
+            <div class="timeline-item" style="animation-delay: 0.8s;">
+                <div class="timeline-node">
+                    <i class="fas fa-image"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-lightbulb"></i>渲染阶段(小图)
+                    </div>
+                    <div class="phase-description">
+                        制作带灯光效果的小图效果图,用于客户确认设计方案和细节调整。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">小图制作</div>
+                            <div class="requirement-desc">
+                                • 调整灯光和材质<br>
+                                • 每张渲染5-10分钟<br>
+                                • 通常需要制作10张左右<br>
+                                • 确保效果图质量
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">客户对图</div>
+                            <div class="requirement-desc">
+                                • 客户查看效果图<br>
+                                • 提出修改意见<br>
+                                • 调整设计细节<br>
+                                • 确认最终方案
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>氛围效果:灯光和氛围是否到位</li>
+                            <li>细节表现:材质和细节是否精致</li>
+                            <li>软装效果:摆放、选品、调性是否统一</li>
+                            <li>整体协调:各元素是否和谐统一</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 大图阶段 -->
+            <div class="timeline-item" style="animation-delay: 1.0s;">
+                <div class="timeline-node">
+                    <i class="fas fa-images"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-hdd"></i>大图阶段
+                    </div>
+                    <div class="phase-description">
+                        制作高清大图作为最终交付物,满足客户打印和工地使用需求。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">大图渲染</div>
+                            <div class="requirement-desc">
+                                • 每张渲染6-8小时<br>
+                                • 确保4K清晰度<br>
+                                • 最长边像素4000以上<br>
+                                • 支持放大查看细节
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">质量标准</div>
+                            <div class="requirement-desc">
+                                • 适合工地打印使用<br>
+                                • 放大后细节清晰<br>
+                                • 色彩还原准确<br>
+                                • 文件格式规范
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>分辨率标准:最长边像素达到4000以上</li>
+                            <li>细节清晰度:放大后能清楚看到细节</li>
+                            <li>色彩准确性:色彩还原度高</li>
+                            <li>打印适用性:适合工地打印需求</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 后期处理阶段 -->
+            <div class="timeline-item" style="animation-delay: 1.2s;">
+                <div class="timeline-node">
+                    <i class="fas fa-magic"></i>
+                </div>
+                <div class="timeline-content">
+                    <div class="phase-title">
+                        <i class="fas fa-paint-brush"></i>后期处理阶段
+                    </div>
+                    <div class="phase-description">
+                        对大图进行PS后期处理,提升画面效果,形成最终交付成果。
+                    </div>
+
+                    <div class="requirements-grid">
+                        <div class="requirement-item">
+                            <div class="requirement-title">后期处理</div>
+                            <div class="requirement-desc">
+                                • 调整对比度和亮度<br>
+                                • 增强细节表现<br>
+                                • 小范围修图优化<br>
+                                • 色彩平衡调整
+                            </div>
+                        </div>
+                        <div class="requirement-item">
+                            <div class="requirement-title">最终交付</div>
+                            <div class="requirement-desc">
+                                • 提供高清成品图<br>
+                                • 确保文件质量<br>
+                                • 按约定格式交付<br>
+                                • 客户确认收货
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="evaluation-criteria">
+                        <div class="evaluation-title">
+                            <i class="fas fa-clipboard-check"></i>评价维度
+                        </div>
+                        <ul class="criteria-list">
+                            <li>后期效果:PS处理是否提升画面质量</li>
+                            <li>细节优化:细节是否得到有效增强</li>
+                            <li>整体效果:最终成品是否达到预期</li>
+                            <li>交付标准:是否符合交付要求</li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- FAQ部分 -->
+        <div class="faq-section animate__animated animate__fadeIn animate__delay-1s">
+            <div class="faq-title">
+                <i class="fas fa-question-circle"></i>项目流程的悖论与思考
+            </div>
+            
+            <div class="mb-4">
+                <h5 class="text-warning">
+                    <i class="fas fa-exclamation-triangle me-2"></i>核心矛盾
+                </h5>
+                <p class="text-secondary">
+                    内部SOP控制了很多细节,但客户购买效果图主要是为了看效果。这造成了复杂流程与简单需求之间的矛盾。
+                </p>
+            </div>
+
+            <div class="row">
+                <div class="col-md-6 mb-3">
+                    <div class="requirement-item">
+                        <div class="requirement-title">客户需求分析</div>
+                        <div class="requirement-desc">
+                            • <strong>谈单签约:</strong>占更多比例,用于展示设计效果<br>
+                            • <strong>施工执行:</strong>用于指导具体施工工作
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-6 mb-3">
+                    <div class="requirement-item">
+                        <div class="requirement-title">未来趋势</div>
+                        <div class="requirement-desc">
+                            • <strong>中低价格:</strong>AI出效果图,只注重效果展示<br>
+                            • <strong>高端项目:</strong>精准控制,完整建模项目流程
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        // 滚动触发动画
+        function animateOnScroll() {
+            const items = document.querySelectorAll('.timeline-item');
+            
+            items.forEach(item => {
+                const rect = item.getBoundingClientRect();
+                const isVisible = rect.top < window.innerHeight && rect.bottom > 0;
+                
+                if (isVisible && !item.classList.contains('animated')) {
+                    item.style.opacity = '1';
+                    item.classList.add('animated');
+                }
+            });
+        }
+
+        // 页面加载和滚动时触发动画
+        window.addEventListener('scroll', animateOnScroll);
+        window.addEventListener('load', animateOnScroll);
+
+        // 初始化动画
+        document.addEventListener('DOMContentLoaded', function() {
+            // 设置初始状态
+            const timelineItems = document.querySelectorAll('.timeline-item');
+            timelineItems.forEach((item, index) => {
+                item.style.animationDelay = `${0.2 * (index + 1)}s`;
+            });
+            
+            // 触发第一次检查
+            setTimeout(animateOnScroll, 500);
+        });
+    </script>
+</body>
+</html>

+ 1 - 1
src/app/models/project.model.ts

@@ -52,7 +52,7 @@ export interface CustomerTag {
 export type ProjectStatus = '进行中' | '已完成' | '已暂停' | '已延期';
 
 // 项目阶段
-export type ProjectStage = '订单创建' | '需求沟通' | '方案确认' | '建模' | '软装' | '渲染' | '后期' | '尾款结算' | '客户评价' | '投诉处理';
+export type ProjectStage = '订单分配' | '需求沟通' | '方案确认' | '建模' | '软装' | '渲染' | '后期' | '尾款结算' | '客户评价' | '投诉处理';
 
 // 任务模型
 // 修复 Task 接口,将 completedAt 改为 completedDate(与实际代码保持一致)

+ 2 - 2
src/app/pages/customer-service/consultation-order/consultation-order-dialog.component.ts

@@ -30,9 +30,9 @@ export class ConsultationOrderDialogComponent {
     this.dialogRef.close();
   }
 
-  // 监听订单创建成功事件
+  // 监听订单分配成功事件
   onOrderCreated(orderData: any): void {
-    // 发出订单创建事件
+    // 发出订单分配事件
     this.orderCreated.emit(orderData);
     // 关闭弹窗并返回订单数据
     this.dialogRef.close(orderData);

+ 1 - 1
src/app/pages/customer-service/consultation-order/consultation-order.scss

@@ -738,7 +738,7 @@ $card-padding: 16px;
   }
 }
 
-// 订单创建方式选择样式
+// 订单分配方式选择样式
 .creation-method-section {
   margin-bottom: 32px;
   animation: fadeIn 0.6s ease-out;

+ 4 - 4
src/app/pages/customer-service/consultation-order/consultation-order.ts

@@ -103,7 +103,7 @@ export class ConsultationOrder {
   // 项目需求卡片展开状态
   isRequirementCardExpanded = signal(false);
 
-  // 订单创建成功事件
+  // 订单分配成功事件
   @Output() orderCreated = new EventEmitter<any>();
 
   // 需求表单
@@ -513,7 +513,7 @@ export class ConsultationOrder {
           setTimeout(() => {
             this.showSuccessMessage.set(false);
             
-            // 发出订单创建成功事件,包含完整表单数据用于同步
+            // 发出订单分配成功事件,包含完整表单数据用于同步
             const orderData = {
               orderId: res.projectId || 'mock-9',
               customerName: nameCtrl.value,
@@ -721,13 +721,13 @@ export class ConsultationOrder {
       this.isSubmitting.set(false);
       this.showSuccessMessage.set(true);
       
-      this.snackBar.open('订单创建成功!', '关闭', {
+      this.snackBar.open('订单分配成功!', '关闭', {
         duration: 3000,
         horizontalPosition: 'center',
         verticalPosition: 'top'
       });
 
-      // 发射订单创建成功事件
+      // 发射订单分配成功事件
       this.orderCreated.emit(orderData);
 
       // 3秒后隐藏成功消息

+ 29 - 12
src/app/pages/customer-service/dashboard/pages/after-sales/after-sales.component.scss

@@ -1960,14 +1960,23 @@ $transition: all 0.2s ease;
   
   mat-icon {
     color: #007aff;
-    font-size: 18px;
-    width: 18px;
-    height: 18px;
+    font-size: 20px !important;
+    width: 20px !important;
+    height: 20px !important;
+    font-family: 'Material Icons' !important;
+    font-feature-settings: 'liga' 1;
+    -webkit-font-smoothing: antialiased;
+    text-rendering: optimizeLegibility;
+    display: inline-flex !important;
+    align-items: center;
+    justify-content: center;
+    overflow: hidden;
   }
   
   span {
     font-size: 14px;
     color: #333;
+    font-weight: 500;
   }
 }
 
@@ -1982,13 +1991,13 @@ $transition: all 0.2s ease;
   }
 }
 
-// 全局下拉面板样式 - 采用人事板块样式,增加透明度
+// 全局下拉面板样式 - 采用人事板块样式,调整透明度避免背景冲突
 :host ::ng-deep .mat-mdc-select-panel {
-  background: rgba(255, 255, 255, 0.85) !important;
-  backdrop-filter: blur(20px) !important;
+  background: rgba(255, 255, 255, 0.98) !important; // 提高不透明度从0.85到0.98
+  backdrop-filter: blur(30px) saturate(180%) !important; // 增强模糊和饱和度
   border-radius: 12px !important;
-  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
-  border: 1px solid rgba(0, 122, 255, 0.2) !important;
+  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18), 0 2px 8px rgba(0, 0, 0, 0.08) !important; // 增强阴影
+  border: 1px solid rgba(0, 122, 255, 0.3) !important; // 增强边框可见度
   max-height: 300px !important;
   z-index: 9999 !important;
   overflow: hidden !important;
@@ -2030,11 +2039,19 @@ $transition: all 0.2s ease;
       width: 100%;
 
       mat-icon {
-        font-size: 18px;
-        width: 18px;
-        height: 18px;
+        font-size: 20px !important;
+        width: 20px !important;
+        height: 20px !important;
         color: inherit;
-        opacity: 0.8;
+        opacity: 0.9;
+        font-family: 'Material Icons' !important; // 确保使用图标字体
+        font-feature-settings: 'liga' 1; // 启用连字特性
+        -webkit-font-smoothing: antialiased; // 字体平滑
+        text-rendering: optimizeLegibility;
+        display: inline-flex !important;
+        align-items: center;
+        justify-content: center;
+        overflow: hidden; // 隐藏溢出的文本
       }
 
       span {

+ 4 - 4
src/app/pages/customer-service/project-list/project-list.ts

@@ -246,7 +246,7 @@ export class ProjectList implements OnInit, OnDestroy {
         '后期': 85,
         '尾款结算': 90,
         '投诉处理': 100,
-        订单创建: 0,
+        订单分配: 0,
         方案确认: 0,
         
         客户评价: 0
@@ -391,7 +391,7 @@ export class ProjectList implements OnInit, OnDestroy {
       case '软装': return 'stage-decoration';
       case '渲染': return 'stage-rendering';
       case '投诉处理': return 'stage-completed';
-      case '订单创建': return 'stage-active';
+      case '订单分配': return 'stage-active';
       case '方案确认': return 'stage-active';
       case '尾款结算': return 'stage-completed';
       case '客户评价': return 'stage-completed';
@@ -445,7 +445,7 @@ export class ProjectList implements OnInit, OnDestroy {
   navigateToProject(project: ProjectListItem, columnId: 'pending' | 'req' | 'delivery' | 'done') {
     // 根据columnId映射到对应的阶段
     const stageMapping = {
-      'pending': '订单创建',
+      'pending': '订单分配',
       'req': project.currentStage || '需求沟通', // 使用项目实际阶段或默认阶段
       'delivery': project.currentStage || '建模', // 使用项目实际阶段或默认阶段
       'done': '客户评价'
@@ -475,7 +475,7 @@ export class ProjectList implements OnInit, OnDestroy {
       panelClass: 'consultation-order-dialog'
     });
 
-    // 监听订单创建成功事件
+    // 监听订单分配成功事件
     dialogRef.componentInstance.orderCreated.subscribe((orderData: any) => {
       // 关闭弹窗
       dialogRef.close();

+ 1 - 1
src/app/pages/designer/personal-board/personal-board.ts

@@ -316,7 +316,7 @@ export class PersonalBoard implements OnInit, AfterViewInit {
   // 根据项目阶段获取对应的结算比例
   getStagePercentage(stage: ProjectStage): number {
     const percentages: Record<ProjectStage, number> = {
-      '订单创建': 0,
+      '订单分配': 0,
       '需求沟通': 0,
       '方案确认': 0,
       '建模': 30,

+ 1 - 1
src/app/pages/designer/project-detail/FINAL-STATUS.md

@@ -211,7 +211,7 @@
 ### ✅ 柱状图(阶段耗时对比)
 
 **显示内容**:
-- 5个阶段(订单创建、需求沟通、方案确认、建模、软装)
+- 5个阶段(订单分配、需求沟通、方案确认、建模、软装)
 - 每个阶段2根柱子(计划时长/实际时长)
 - 图例说明清晰
 

+ 321 - 21
src/app/pages/designer/project-detail/components/designer-assignment/designer-assignment.component.ts

@@ -80,7 +80,6 @@ export class DesignerAssignmentComponent implements OnInit {
           teamId: 'team-1',
           teamName: '家装设计组',
           isTeamLeader: true,
-          // 为了兼容弹窗与日历组件,补充映射字段
           groupId: 'team-1',
           groupName: '家装设计组',
           isLeader: true,
@@ -102,13 +101,12 @@ export class DesignerAssignmentComponent implements OnInit {
           teamId: 'team-1',
           teamName: '家装设计组',
           isTeamLeader: false,
-          // 为了兼容弹窗与日历组件,补充映射字段
           groupId: 'team-1',
           groupName: '家装设计组',
           isLeader: false,
           currentProjects: 2,
-          status: 'busy',
-          idleDays: 0,
+          status: 'idle',
+          idleDays: 2,
           recentOrders: 1,
           lastOrderDate: '2024-01-10',
           reviewDates: [],
@@ -120,25 +118,45 @@ export class DesignerAssignmentComponent implements OnInit {
         },
         {
           id: 'designer-5',
-          name: '赵停滞',
+          name: '陈设计师',
           teamId: 'team-1',
           teamName: '家装设计组',
           isTeamLeader: false,
-          // 为了兼容弹窗与日历组件,补充映射字段
           groupId: 'team-1',
           groupName: '家装设计组',
           isLeader: false,
-          currentProjects: 4,
-          status: 'busy',
-          idleDays: 0,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 5,
           recentOrders: 1,
-          lastOrderDate: '2023-12-20',
+          lastOrderDate: '2024-01-05',
           reviewDates: [],
-          workload: 90,
-          skills: ['家装设计'],
-          isOnStagnantProject: true,
-          isInStagnantProject: true,
-          availableDates: []
+          workload: 20,
+          skills: ['家装设计', '色彩搭配'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25']
+        },
+        {
+          id: 'designer-6',
+          name: '刘设计师',
+          teamId: 'team-1',
+          teamName: '家装设计组',
+          isTeamLeader: false,
+          groupId: 'team-1',
+          groupName: '家装设计组',
+          isLeader: false,
+          currentProjects: 2,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 2,
+          lastOrderDate: '2024-01-12',
+          reviewDates: ['2024-01-21'],
+          workload: 65,
+          skills: ['家装设计', '现代风格'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-24', '2024-01-25']
         }
       ]
     },
@@ -154,7 +172,6 @@ export class DesignerAssignmentComponent implements OnInit {
           teamId: 'team-2',
           teamName: '工装设计组',
           isTeamLeader: true,
-          // 为了兼容弹窗与日历组件,补充映射字段
           groupId: 'team-2',
           groupName: '工装设计组',
           isLeader: true,
@@ -176,21 +193,304 @@ export class DesignerAssignmentComponent implements OnInit {
           teamId: 'team-2',
           teamName: '工装设计组',
           isTeamLeader: false,
-          // 为了兼容弹窗与日历组件,补充映射字段
           groupId: 'team-2',
           groupName: '工装设计组',
+          isLeader: false,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 3,
+          recentOrders: 0,
+          lastOrderDate: '2024-01-03',
+          reviewDates: [],
+          workload: 15,
+          skills: ['工装设计', '效果图制作'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25', '2024-01-26']
+        },
+        {
+          id: 'designer-7',
+          name: '周设计师',
+          teamId: 'team-2',
+          teamName: '工装设计组',
+          isTeamLeader: false,
+          groupId: 'team-2',
+          groupName: '工装设计组',
+          isLeader: false,
+          currentProjects: 2,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 1,
+          lastOrderDate: '2024-01-13',
+          reviewDates: ['2024-01-19'],
+          workload: 55,
+          skills: ['工装设计', '办公空间'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-22', '2024-01-23', '2024-01-24']
+        }
+      ]
+    },
+    {
+      id: 'team-3',
+      name: '软装设计组',
+      leaderId: 'designer-8',
+      leaderName: '吴组长',
+      members: [
+        {
+          id: 'designer-8',
+          name: '吴组长',
+          teamId: 'team-3',
+          teamName: '软装设计组',
+          isTeamLeader: true,
+          groupId: 'team-3',
+          groupName: '软装设计组',
           isLeader: true,
           currentProjects: 2,
-          status: 'reviewing',
+          status: 'busy',
           idleDays: 0,
+          recentOrders: 2,
+          lastOrderDate: '2024-01-16',
+          reviewDates: ['2024-01-21', '2024-01-24'],
+          workload: 75,
+          skills: ['软装设计', '色彩搭配', '项目管理'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-19', '2024-01-20']
+        },
+        {
+          id: 'designer-9',
+          name: '郑设计师',
+          teamId: 'team-3',
+          teamName: '软装设计组',
+          isTeamLeader: false,
+          groupId: 'team-3',
+          groupName: '软装设计组',
+          isLeader: false,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 4,
+          recentOrders: 1,
+          lastOrderDate: '2024-01-08',
+          reviewDates: [],
+          workload: 25,
+          skills: ['软装设计', '家具搭配'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25']
+        },
+        {
+          id: 'designer-10',
+          name: '冯设计师',
+          teamId: 'team-3',
+          teamName: '软装设计组',
+          isTeamLeader: false,
+          groupId: 'team-3',
+          groupName: '软装设计组',
+          isLeader: false,
+          currentProjects: 2,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 2,
+          lastOrderDate: '2024-01-15',
+          reviewDates: [],
+          workload: 60,
+          skills: ['软装设计', '陈设设计'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-23', '2024-01-24', '2024-01-25']
+        }
+      ]
+    },
+    {
+      id: 'team-4',
+      name: '建模渲染组',
+      leaderId: 'designer-11',
+      leaderName: '孙组长',
+      members: [
+        {
+          id: 'designer-11',
+          name: '孙组长',
+          teamId: 'team-4',
+          teamName: '建模渲染组',
+          isTeamLeader: true,
+          groupId: 'team-4',
+          groupName: '建模渲染组',
+          isLeader: true,
+          currentProjects: 3,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 3,
+          lastOrderDate: '2024-01-16',
+          reviewDates: ['2024-01-20', '2024-01-23'],
+          workload: 80,
+          skills: ['3D建模', 'VRay渲染', '项目管理'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-21', '2024-01-22']
+        },
+        {
+          id: 'designer-12',
+          name: '钱设计师',
+          teamId: 'team-4',
+          teamName: '建模渲染组',
+          isTeamLeader: false,
+          groupId: 'team-4',
+          groupName: '建模渲染组',
+          isLeader: false,
+          currentProjects: 2,
+          status: 'idle',
+          idleDays: 1,
+          recentOrders: 2,
+          lastOrderDate: '2024-01-12',
+          reviewDates: [],
+          workload: 40,
+          skills: ['3D建模', 'Corona渲染'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23']
+        },
+        {
+          id: 'designer-13',
+          name: '何设计师',
+          teamId: 'team-4',
+          teamName: '建模渲染组',
+          isTeamLeader: false,
+          groupId: 'team-4',
+          groupName: '建模渲染组',
+          isLeader: false,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 6,
           recentOrders: 0,
-          lastOrderDate: '2024-01-03',
+          lastOrderDate: '2024-01-01',
           reviewDates: [],
           workload: 10,
-          skills: ['工装设计', '效果图制作'],
+          skills: ['3D建模', '材质贴图'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25', '2024-01-26']
+        }
+      ]
+    },
+    {
+      id: 'team-5',
+      name: '后期处理组',
+      leaderId: 'designer-14',
+      leaderName: '朱组长',
+      members: [
+        {
+          id: 'designer-14',
+          name: '朱组长',
+          teamId: 'team-5',
+          teamName: '后期处理组',
+          isTeamLeader: true,
+          groupId: 'team-5',
+          groupName: '后期处理组',
+          isLeader: true,
+          currentProjects: 2,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 2,
+          lastOrderDate: '2024-01-15',
+          reviewDates: ['2024-01-19', '2024-01-23'],
+          workload: 70,
+          skills: ['后期处理', 'Photoshop', '项目管理'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-20', '2024-01-21', '2024-01-22']
+        },
+        {
+          id: 'designer-15',
+          name: '徐设计师',
+          teamId: 'team-5',
+          teamName: '后期处理组',
+          isTeamLeader: false,
+          groupId: 'team-5',
+          groupName: '后期处理组',
+          isLeader: false,
+          currentProjects: 2,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 1,
+          lastOrderDate: '2024-01-14',
+          reviewDates: [],
+          workload: 50,
+          skills: ['后期处理', '图片精修'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-22', '2024-01-23', '2024-01-24']
+        },
+        {
+          id: 'designer-16',
+          name: '许设计师',
+          teamId: 'team-5',
+          teamName: '后期处理组',
+          isTeamLeader: false,
+          groupId: 'team-5',
+          groupName: '后期处理组',
+          isLeader: false,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 3,
+          recentOrders: 1,
+          lastOrderDate: '2024-01-10',
+          reviewDates: [],
+          workload: 35,
+          skills: ['后期处理', '色彩校正'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25']
+        }
+      ]
+    },
+    {
+      id: 'team-6',
+      name: '全景图制作组',
+      leaderId: 'designer-17',
+      leaderName: '马组长',
+      members: [
+        {
+          id: 'designer-17',
+          name: '马组长',
+          teamId: 'team-6',
+          teamName: '全景图制作组',
+          isTeamLeader: true,
+          groupId: 'team-6',
+          groupName: '全景图制作组',
+          isLeader: true,
+          currentProjects: 3,
+          status: 'busy',
+          idleDays: 0,
+          recentOrders: 3,
+          lastOrderDate: '2024-01-16',
+          reviewDates: ['2024-01-20', '2024-01-22', '2024-01-25'],
+          workload: 85,
+          skills: ['全景图合成', 'KR Panel', '项目管理'],
+          isOnStagnantProject: false,
+          isInStagnantProject: false,
+          availableDates: ['2024-01-21']
+        },
+        {
+          id: 'designer-18',
+          name: '韩设计师',
+          teamId: 'team-6',
+          teamName: '全景图制作组',
+          isTeamLeader: false,
+          groupId: 'team-6',
+          groupName: '全景图制作组',
+          isLeader: false,
+          currentProjects: 1,
+          status: 'idle',
+          idleDays: 2,
+          recentOrders: 1,
+          lastOrderDate: '2024-01-11',
+          reviewDates: [],
+          workload: 30,
+          skills: ['全景图合成', '图片拼接'],
           isOnStagnantProject: false,
           isInStagnantProject: false,
-          availableDates: ['2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24', '2024-01-25', '2024-01-26']
+          availableDates: ['2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-22', '2024-01-23', '2024-01-24']
         }
       ]
     }

+ 26 - 33
src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.html

@@ -74,38 +74,30 @@
         @for (day of monthGrid; track day.date.getTime()) {
           <div class="calendar-day" 
                [class]="getDayClass(day)"
-               [title]="day.tooltip"
+               [attr.data-status]="getDayStatus(day)"
+               [title]="getDayTooltip(day)"
                (click)="onDayClick(day)">
             
             <!-- 日期数字 -->
             <div class="day-number">{{ day.date.getDate() }}</div>
             
-            <!-- 工作状态指示器 -->
-            <div class="day-status">
+            <!-- 工作状态文本 -->
+            <div class="day-status-text">
               @if (day.isReviewDay) {
-                <div class="status-indicator review">
-                  <mat-icon>visibility</mat-icon>
-                  <span>对图</span>
-                </div>
+                <span class="status-label review-label">对图</span>
               } @else if (day.orderCount > 0) {
-                <div class="status-indicator busy">
-                  <mat-icon>work</mat-icon>
-                  <span>{{ day.orderCount }}单</span>
-                </div>
+                <span class="status-label busy-label">{{ day.orderCount }}单</span>
               } @else if (day.isIdle && day.isCurrentMonth) {
-                <div class="status-indicator idle">
-                  <mat-icon>check_circle</mat-icon>
-                  <span>空闲</span>
-                </div>
+                <span class="status-label idle-label">空闲</span>
               }
             </div>
             
-            <!-- 工作负荷条 -->
+            <!-- 工作负荷指示条 -->
             @if (day.isCurrentMonth && (day.orderCount > 0 || day.isReviewDay)) {
-              <div class="workload-bar-mini">
-                <div class="workload-fill-mini" 
-                     [class]="day.isReviewDay ? 'review' : (day.orderCount >= 2 ? 'high' : 'medium')"
-                     [style.width.%]="day.isReviewDay ? 100 : (day.orderCount * 50)">
+              <div class="workload-indicator-bar">
+                <div class="workload-fill" 
+                     [class]="day.isReviewDay ? 'review-fill' : (day.orderCount >= 2 ? 'high-fill' : 'medium-fill')"
+                     [style.width.%]="day.isReviewDay ? 100 : Math.min(day.orderCount * 40, 100)">
                 </div>
               </div>
             }
@@ -117,31 +109,32 @@
     <!-- 图例说明 -->
     <div class="calendar-legend">
       <div class="legend-item">
-        <span class="legend-color idle"></span>
-        <span class="legend-text">空闲可分配</span>
+        <span class="legend-color idle-color"></span>
+        <span class="legend-text">空闲可分配(绿色)</span>
       </div>
       <div class="legend-item">
-        <span class="legend-color busy"></span>
-        <span class="legend-text">有订单</span>
+        <span class="legend-color busy-color"></span>
+        <span class="legend-text">有订单工作中(蓝色)</span>
       </div>
       <div class="legend-item">
-        <span class="legend-color review"></span>
-        <span class="legend-text">对图日期</span>
+        <span class="legend-color review-color"></span>
+        <span class="legend-text">对图日期不可分配(红色)</span>
       </div>
       <div class="legend-item">
-        <span class="legend-color today"></span>
-        <span class="legend-text">今天</span>
+        <span class="legend-color today-color"></span>
+        <span class="legend-text">今天(橙色边框)</span>
       </div>
     </div>
 
     <!-- 操作提示 -->
     <div class="calendar-tips">
-      <p><strong>使用说明:</strong></p>
+      <p><strong>颜色说明:</strong></p>
       <ul>
-        <li>🟢 绿色日期表示空闲,可以分配新订单</li>
-        <li>🔵 蓝色日期表示有订单,工作负荷适中</li>
-        <li>🔴 红色日期表示对图日期,完全不能分配其他工作</li>
-        <li>📊 底部进度条显示当日工作负荷强度</li>
+        <li>🟢 <strong>绿色背景</strong> - 空闲日期,可以分配新订单</li>
+        <li>🔵 <strong>蓝色背景</strong> - 有订单工作中,根据订单数量显示深浅</li>
+        <li>🔴 <strong>红色背景</strong> - 对图日期,完全不能分配其他工作</li>
+        <li>🟠 <strong>橙色边框</strong> - 今天的日期</li>
+        <li>📊 <strong>底部彩条</strong> - 工作负荷强度指示</li>
         <li>👆 点击空闲日期可以快速分配订单</li>
       </ul>
     </div>

+ 190 - 42
src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.scss

@@ -348,34 +348,40 @@
 .calendar-day {
   box-sizing: border-box;
   background: white;
-  min-height: 100px; // 提升可读性,确保忙闲标识完整展示
+  min-height: 100px;
   padding: 8px;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: flex-start;
   cursor: pointer;
-  transition: all 0.2s ease;
+  transition: all 0.3s ease;
   position: relative;
+  border-radius: 8px;
+  border: 2px solid transparent;
 
   .day-number {
     font-size: 16px;
     font-weight: 600;
-    margin-bottom: 8px;
+    margin-bottom: 6px;
     z-index: 2;
+    color: #2c3e50;
   }
 
-  .day-status {
+  .day-status-text {
     flex: 1;
     display: flex;
     align-items: center;
     justify-content: center;
     width: 100%;
+    margin-bottom: 4px;
 
-    .status-indicator {
-      display: flex;
-      flex-direction: column;
-      align-items: center;
+    .status-label {
+      font-size: 12px;
+      font-weight: 500;
+      padding: 2px 8px;
+      border-radius: 12px;
+      color: white;
       gap: 4px;
       padding: 4px;
       border-radius: 6px;
@@ -417,31 +423,61 @@
     }
   }
 
+  .workload-indicator-bar {
+    position: absolute;
+    bottom: 4px;
+    left: 8px;
+    right: 8px;
+    height: 4px;
+    background: rgba(0, 0, 0, 0.1);
+    border-radius: 3px;
+    overflow: hidden;
+
+    .workload-fill {
+      height: 100%;
+      border-radius: 3px;
+      transition: width 0.3s ease;
+
+      &.medium-fill {
+        background: linear-gradient(90deg, #ffc107 0%, #ffb300 100%);
+      }
+
+      &.high-fill {
+        background: linear-gradient(90deg, #ff9800 0%, #f57c00 100%);
+      }
+
+      &.review-fill {
+        background: linear-gradient(90deg, #dc3545 0%, #b02a37 100%);
+      }
+    }
+  }
+
+  // 保留旧样式兼容
   .workload-bar-mini {
     position: absolute;
     bottom: 4px;
-    left: 4px;
-    right: 4px;
-    height: 3px;
+    left: 8px;
+    right: 8px;
+    height: 4px;
     background: rgba(0, 0, 0, 0.1);
-    border-radius: 2px;
+    border-radius: 3px;
     overflow: hidden;
 
     .workload-fill-mini {
       height: 100%;
-      border-radius: 2px;
+      border-radius: 3px;
       transition: width 0.3s ease;
 
       &.medium {
-        background: #ffc107;
+        background: linear-gradient(90deg, #ffc107 0%, #ffb300 100%);
       }
 
       &.high {
-        background: #ff9800;
+        background: linear-gradient(90deg, #ff9800 0%, #f57c00 100%);
       }
 
       &.review {
-        background: #f44336;
+        background: linear-gradient(90deg, #dc3545 0%, #b02a37 100%);
       }
     }
   }
@@ -461,56 +497,143 @@
   }
 
   &.today {
-    background: #e3f2fd;
-    border: 2px solid #2196f3;
+    border: 3px solid #ff6b35 !important;
+    box-shadow: 0 0 0 2px rgba(255, 107, 53, 0.2);
+
+    .day-number {
+      color: #ff6b35;
+      font-weight: 700;
+    }
+  }
+
+  // 使用 data-status 属性进行样式控制
+  &[data-status="idle"] {
+    background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
+    border: 2px solid #28a745;
+
+    &:hover {
+      background: linear-gradient(135deg, #c3e6cb 0%, #b1dfbb 100%);
+      transform: scale(1.05);
+      box-shadow: 0 6px 20px rgba(40, 167, 69, 0.4);
+    }
 
     .day-number {
-      color: #1976d2;
+      color: #155724;
       font-weight: 700;
     }
+
+    .status-label.idle-label {
+      background: #28a745;
+      color: white;
+    }
   }
 
+  &[data-status="busy-medium"] {
+    background: linear-gradient(135deg, #cfe2ff 0%, #b6d4fe 100%);
+    border: 2px solid #0d6efd;
+
+    .day-number {
+      color: #084298;
+      font-weight: 700;
+    }
+
+    .status-label.busy-label {
+      background: #0d6efd;
+      color: white;
+    }
+
+    &:hover {
+      background: linear-gradient(135deg, #b6d4fe 0%, #9ec5fe 100%);
+      transform: scale(1.05);
+      box-shadow: 0 6px 20px rgba(13, 110, 253, 0.4);
+    }
+  }
+
+  &[data-status="busy-high"] {
+    background: linear-gradient(135deg, #9ec5fe 0%, #6ea8fe 100%);
+    border: 2px solid #0a58ca;
+
+    .day-number {
+      color: #052c65;
+      font-weight: 700;
+    }
+
+    .status-label.busy-label {
+      background: #0a58ca;
+      color: white;
+    }
+
+    &:hover {
+      background: linear-gradient(135deg, #6ea8fe 0%, #3d8bfd 100%);
+      transform: scale(1.05);
+      box-shadow: 0 6px 20px rgba(10, 88, 202, 0.5);
+    }
+  }
+
+  &[data-status="review"] {
+    background: linear-gradient(135deg, #f8d7da 0%, #f5c2c7 100%);
+    border: 2px solid #dc3545;
+    cursor: not-allowed;
+
+    .day-number {
+      color: #842029;
+      font-weight: 700;
+    }
+
+    .status-label.review-label {
+      background: #dc3545;
+      color: white;
+    }
+
+    &:hover {
+      transform: none;
+      box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3);
+    }
+  }
+
+  // 保留旧的类名兼容性
   &.idle {
-    background: #e8f5e8;
-    border: 1px solid #4caf50;
+    background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
+    border: 2px solid #28a745;
 
     &:hover {
-      background: #c8e6c9;
-      transform: scale(1.02);
-      box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
+      background: linear-gradient(135deg, #c3e6cb 0%, #b1dfbb 100%);
+      transform: scale(1.05);
+      box-shadow: 0 6px 20px rgba(40, 167, 69, 0.4);
     }
 
     .day-number {
-      color: #2e7d32;
+      color: #155724;
     }
   }
 
   &.busy {
-    background: #e3f2fd;
+    background: linear-gradient(135deg, #cfe2ff 0%, #b6d4fe 100%);
+    border: 2px solid #0d6efd;
 
     .day-number {
-      color: #1565c0;
+      color: #084298;
     }
 
     &:hover {
-      background: #bbdefb;
-      transform: scale(1.02);
-      box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);
+      background: linear-gradient(135deg, #b6d4fe 0%, #9ec5fe 100%);
+      transform: scale(1.05);
+      box-shadow: 0 6px 20px rgba(13, 110, 253, 0.4);
     }
   }
 
   &.review {
-    background: #ffebee;
-    border: 1px solid #f44336;
+    background: linear-gradient(135deg, #f8d7da 0%, #f5c2c7 100%);
+    border: 2px solid #dc3545;
     cursor: not-allowed;
 
     .day-number {
-      color: #c62828;
+      color: #842029;
     }
 
     &:hover {
       transform: none;
-      box-shadow: 0 2px 8px rgba(244, 67, 54, 0.2);
+      box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3);
     }
   }
 
@@ -586,25 +709,50 @@
     gap: 6px;
 
     .legend-color {
-      width: 12px;
-      height: 12px;
-      border-radius: 2px;
+      width: 20px;
+      height: 20px;
+      border-radius: 4px;
+      border: 1px solid rgba(0, 0, 0, 0.1);
+
+      &.idle-color {
+        background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
+        border: 2px solid #28a745;
+      }
+
+      &.busy-color {
+        background: linear-gradient(135deg, #cfe2ff 0%, #b6d4fe 100%);
+        border: 2px solid #0d6efd;
+      }
+
+      &.review-color {
+        background: linear-gradient(135deg, #f8d7da 0%, #f5c2c7 100%);
+        border: 2px solid #dc3545;
+      }
+
+      &.today-color {
+        background: white;
+        border: 3px solid #ff6b35;
+      }
 
+      // 保留旧样式兼容
       &.idle {
-        background: #4caf50;
+        background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
+        border: 2px solid #28a745;
       }
 
       &.busy {
-        background: #2196f3;
+        background: linear-gradient(135deg, #cfe2ff 0%, #b6d4fe 100%);
+        border: 2px solid #0d6efd;
       }
 
       &.review {
-        background: #f44336;
+        background: linear-gradient(135deg, #f8d7da 0%, #f5c2c7 100%);
+        border: 2px solid #dc3545;
       }
 
       &.today {
-        background: #1976d2;
-        border: 1px solid #0d47a1;
+        background: white;
+        border: 3px solid #ff6b35;
       }
     }
 

+ 36 - 0
src/app/pages/designer/project-detail/components/designer-calendar/designer-calendar.component.ts

@@ -280,4 +280,40 @@ export class DesignerCalendarComponent implements OnInit, OnChanges {
     }
     return '空闲可分配新订单';
   }
+
+  // 获取日期状态(用于样式)
+  getDayStatus(day: CalendarDay): string {
+    if (!day.isCurrentMonth) return 'other-month';
+    if (day.isReviewDay) return 'review';
+    if (day.orderCount >= 2) return 'busy-high';
+    if (day.orderCount > 0) return 'busy-medium';
+    if (day.isIdle) return 'idle';
+    return 'normal';
+  }
+
+  // 获取详细的 tooltip
+  getDayTooltip(day: CalendarDay): string {
+    if (!day.isCurrentMonth) return '';
+    
+    const parts: string[] = [];
+    
+    if (day.isToday) {
+      parts.push('【今天】');
+    }
+    
+    if (day.isReviewDay) {
+      parts.push('🔴 对图日期 - 完全不可分配');
+    } else if (day.orderCount >= 2) {
+      parts.push(`🔵 已有${day.orderCount}个订单 - 工作负荷高`);
+    } else if (day.orderCount === 1) {
+      parts.push(`🔵 已有1个订单 - 可继续分配`);
+    } else if (day.isIdle) {
+      parts.push('🟢 空闲 - 可分配新订单');
+    }
+    
+    return parts.join(' ');
+  }
+
+  // 导出 Math 对象供模板使用
+  Math = Math;
 }

+ 1 - 1
src/app/pages/designer/project-detail/components/order-creation/order-creation.component.html

@@ -1,6 +1,6 @@
 <div class="order-creation-container">
   <div class="section-header">
-    <h3>订单创建信息</h3>
+    <h3>订单分配信息</h3>
     <span class="required-note">* 为必填项</span>
     <div class="header-actions">
       <button type="button" class="btn-primary" (click)="showPricingRules()">

+ 1 - 1
src/app/pages/designer/project-detail/components/order-creation/order-creation.component.scss

@@ -1,4 +1,4 @@
-/* 订单创建组件样式 */
+/* 订单分配组件样式 */
 .order-creation-container {
   padding: 20px;
   background: white;

+ 161 - 0
src/app/pages/designer/project-detail/components/reference-image-manager/README.md

@@ -0,0 +1,161 @@
+# 参考图管理组件
+
+## 功能概述
+
+参考图管理组件是为了解决设计师与客户之间沟通不畅的问题而设计的。它帮助设计师更好地理解和管理客户提供的参考图,确保设计方向准确无误。
+
+## 核心功能
+
+### 1. 参考图分类管理
+
+支持四种主要分类:
+- **灯光参考** 💡:用于参考灯光布局和照明效果
+- **软装参考** 🛋️:用于参考家具、装饰品等软装元素
+- **氛围参考** ✨:用于参考整体氛围和感觉
+- **结构参考** 📐:用于参考空间结构和布局
+
+每张参考图可以设置多个分类标签,便于快速筛选和查找。
+
+### 2. 详细描述与标注
+
+- **图片名称**:为每张参考图命名
+- **分类标签**:可多选,精确标记参考用途
+- **描述说明**:详细描述参考哪些元素
+- **关键要素**:添加标签标记重点元素(如"吊灯造型"、"暖色调"等)
+
+### 3. AI智能追问助手
+
+根据参考图数量和完整度,AI会自动提供专业的追问建议:
+
+#### 参考图较多时(≥3张)
+- 明确哪张图用于灯光参考
+- 区分软装参考图
+- 确认氛围感觉的主要参考
+- 说明结构布局依据
+
+#### 参考图较少时(<3张)
+- 细化感觉来源
+- 明确重点元素
+- 探索细节要求
+- 确认可调整空间
+
+### 4. 视图模式切换
+
+- **网格视图**:卡片式展示,适合快速浏览
+- **列表视图**:表格式展示,适合查看详细信息
+
+### 5. 分类筛选
+
+快速筛选特定类型的参考图:
+- 全部
+- 灯光参考
+- 软装参考
+- 氛围参考
+- 结构参考
+- 未分类(需要补充信息的图片)
+
+## 使用场景
+
+### 场景1:参考图较多的情况
+
+**问题**:客户提供了10张参考图,但没有说明每张图的具体用途。
+
+**解决方案**:
+1. 点击每张图片右下角的"AI智能追问"按钮
+2. AI会根据图片数量提供针对性的追问建议
+3. 选择合适的追问问题发送给客户
+4. 根据客户回复,为每张图添加正确的分类标签和描述
+
+### 场景2:参考图描述模糊
+
+**问题**:客户只说"我喜欢这个感觉",但不清楚具体喜欢什么。
+
+**解决方案**:
+1. 使用AI追问助手中的"细化感觉来源"问题
+2. 询问客户具体喜欢的方面(色调、光线、家具搭配等)
+3. 将客户的回复记录在描述字段中
+4. 添加关键要素标签,便于后续参考
+
+### 场景3:效果图与预期不符
+
+**问题**:做出的效果图客户不满意,觉得和参考图不一样。
+
+**解决方案**:
+1. 回到参考图管理页面
+2. 检查每张参考图的分类和描述是否完整
+3. 对未明确的参考图使用AI追问补充信息
+4. 与客户确认每张图的具体参考点
+5. 根据明确的参考依据重新调整设计
+
+## 最佳实践
+
+### 1. 上传参考图后立即分类
+
+不要等到开始设计时才整理参考图,上传后立即进行分类和标注。
+
+### 2. 充分利用AI追问
+
+遇到模糊的参考图时,不要猜测客户的意图,使用AI追问获取明确信息。
+
+### 3. 详细记录客户反馈
+
+将客户对参考图的说明详细记录在描述字段中,避免遗忘重要信息。
+
+### 4. 使用关键要素标签
+
+为重要元素添加标签,便于快速定位设计重点。
+
+### 5. 定期回顾参考图
+
+在设计过程中定期回顾参考图管理页面,确保设计方向正确。
+
+## 技术特性
+
+- **响应式设计**:支持桌面端和移动端访问
+- **拖拽上传**:支持拖拽文件到上传区域
+- **批量操作**:可以一次上传多张图片
+- **实时筛选**:分类标签点击即时筛选
+- **本地预览**:上传前即可预览图片
+
+## 数据结构
+
+```typescript
+interface ReferenceImage {
+  id: string;                    // 图片ID
+  name: string;                  // 图片名称
+  url: string;                   // 图片URL
+  categories: string[];          // 分类数组
+  description?: string;          // 描述说明
+  tags?: string[];              // 关键要素标签
+  uploadDate: Date;             // 上传日期
+}
+```
+
+## FAQ
+
+**Q: 一张图可以设置多个分类吗?**
+A: 可以。有些参考图可能同时参考多个方面,比如既参考灯光又参考氛围。
+
+**Q: AI追问的问题可以自定义吗?**
+A: 可以。除了AI建议的问题,还可以在"自定义追问"区域输入自己的问题。
+
+**Q: 如果客户没有提供参考图怎么办?**
+A: 可以从案例库中选择相似的案例作为参考,或者主动向客户索要参考图。
+
+**Q: 参考图会自动保存到项目文件中吗?**
+A: 是的,上传的参考图会自动关联到当前项目,可以在项目文件标签页中查看。
+
+## 更新日志
+
+### v1.0.0 (2024-01)
+- ✅ 基础参考图管理功能
+- ✅ 四种分类标签支持
+- ✅ AI智能追问助手
+- ✅ 网格/列表视图切换
+- ✅ 拖拽上传功能
+- ✅ 响应式设计
+
+## 反馈与建议
+
+如果您在使用过程中遇到问题或有改进建议,请联系开发团队。
+

+ 154 - 0
src/app/pages/designer/project-detail/components/reference-image-manager/icons.scss

@@ -0,0 +1,154 @@
+/* 参考图管理组件图标样式 */
+
+/* 使用伪元素实现简单的图标效果 */
+i[class^="icon-"] {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  position: relative;
+}
+
+/* 图片图标 */
+.icon-images::before {
+  content: '🖼️';
+}
+
+.icon-image::before {
+  content: '🖼️';
+}
+
+/* 网格图标 */
+.icon-grid::before {
+  content: '▦';
+  font-weight: bold;
+}
+
+/* 列表图标 */
+.icon-list::before {
+  content: '☰';
+  font-weight: bold;
+}
+
+/* 上传图标 */
+.icon-upload::before {
+  content: '⬆';
+}
+
+/* 灯泡/灯光图标 */
+.icon-lightbulb::before {
+  content: '💡';
+}
+
+/* 沙发/软装图标 */
+.icon-couch::before {
+  content: '🛋️';
+}
+
+/* 星星/氛围图标 */
+.icon-stars::before {
+  content: '✨';
+}
+
+/* 立方体/结构图标 */
+.icon-cube::before {
+  content: '📐';
+}
+
+/* 警告图标 */
+.icon-alert::before {
+  content: '⚠️';
+}
+
+/* 编辑图标 */
+.icon-edit::before {
+  content: '✏️';
+}
+
+/* 删除图标 */
+.icon-delete::before {
+  content: '🗑️';
+}
+
+/* 关闭图标 */
+.icon-close::before {
+  content: '×';
+  font-size: 1.5em;
+  font-weight: bold;
+}
+
+/* 云上传图标 */
+.icon-cloud-upload::before {
+  content: '☁️';
+  font-size: 2em;
+}
+
+/* 信息图标 */
+.icon-info::before {
+  content: 'ℹ️';
+}
+
+/* 检查圆圈图标 */
+.icon-check-circle::before {
+  content: '✓';
+  font-weight: bold;
+}
+
+/* 警告圆圈图标 */
+.icon-alert-circle::before {
+  content: '!';
+  font-weight: bold;
+}
+
+/* 帮助圆圈图标 */
+.icon-help-circle::before {
+  content: '?';
+  font-weight: bold;
+}
+
+/* 闪光/AI图标 */
+.icon-sparkles::before {
+  content: '✨';
+}
+
+/* 箭头右图标 */
+.icon-arrow-right::before {
+  content: '→';
+  font-weight: bold;
+}
+
+/* 消息圆圈图标 */
+.icon-message-circle::before {
+  content: '💬';
+}
+
+/* 发送图标 */
+.icon-send::before {
+  content: '📤';
+}
+
+/* 检查图标 */
+.icon-check::before {
+  content: '✓';
+  font-weight: bold;
+}
+
+/* 心形图标 */
+.icon-heart::before {
+  content: '❤️';
+}
+
+/* 目标图标 */
+.icon-target::before {
+  content: '🎯';
+}
+
+/* 放大图标 */
+.icon-zoom-in::before {
+  content: '🔍';
+}
+
+/* 滑块图标 */
+.icon-sliders::before {
+  content: '🎛️';
+}
+

+ 475 - 0
src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.html

@@ -0,0 +1,475 @@
+<div class="reference-image-manager">
+  <!-- 顶部标题和操作栏 -->
+  <div class="manager-header">
+    <div class="header-left">
+      <h2 class="manager-title">
+        <i class="icon-images"></i>
+        参考图管理
+      </h2>
+      <span class="image-count">共 {{ referenceImages.length }} 张参考图</span>
+    </div>
+    <div class="header-right">
+      <button class="btn-view-mode" [class.active]="viewMode === 'grid'" (click)="viewMode = 'grid'">
+        <i class="icon-grid"></i>
+        网格视图
+      </button>
+      <button class="btn-view-mode" [class.active]="viewMode === 'list'" (click)="viewMode = 'list'">
+        <i class="icon-list"></i>
+        列表视图
+      </button>
+      <button class="btn-upload" (click)="openUploadDialog()">
+        <i class="icon-upload"></i>
+        上传参考图
+      </button>
+    </div>
+  </div>
+
+  <!-- 分类筛选标签 -->
+  <div class="category-filters">
+    <button 
+      class="filter-tag" 
+      [class.active]="activeFilter === 'all'"
+      (click)="filterByCategory('all')">
+      全部 ({{ referenceImages.length }})
+    </button>
+    <button 
+      class="filter-tag filter-tag-lighting" 
+      [class.active]="activeFilter === 'lighting'"
+      (click)="filterByCategory('lighting')">
+      <i class="icon-lightbulb"></i>
+      灯光参考 ({{ getCategoryCount('lighting') }})
+    </button>
+    <button 
+      class="filter-tag filter-tag-furniture" 
+      [class.active]="activeFilter === 'furniture'"
+      (click)="filterByCategory('furniture')">
+      <i class="icon-couch"></i>
+      软装参考 ({{ getCategoryCount('furniture') }})
+    </button>
+    <button 
+      class="filter-tag filter-tag-atmosphere" 
+      [class.active]="activeFilter === 'atmosphere'"
+      (click)="filterByCategory('atmosphere')">
+      <i class="icon-stars"></i>
+      氛围参考 ({{ getCategoryCount('atmosphere') }})
+    </button>
+    <button 
+      class="filter-tag filter-tag-structure" 
+      [class.active]="activeFilter === 'structure'"
+      (click)="filterByCategory('structure')">
+      <i class="icon-cube"></i>
+      结构参考 ({{ getCategoryCount('structure') }})
+    </button>
+    <button 
+      class="filter-tag filter-tag-uncategorized" 
+      [class.active]="activeFilter === 'uncategorized'"
+      (click)="filterByCategory('uncategorized')">
+      <i class="icon-alert"></i>
+      未分类 ({{ getUncategorizedCount() }})
+    </button>
+  </div>
+
+  <!-- 网格视图 -->
+  <div class="images-grid" *ngIf="viewMode === 'grid'">
+    <div class="image-card" *ngFor="let image of filteredImages; let i = index" 
+         [class.selected]="selectedImageId === image.id"
+         (click)="selectImage(image)">
+      <div class="image-container">
+        <img [src]="image.url" [alt]="image.name" />
+        <div class="image-overlay">
+          <button class="btn-icon" (click)="editImage(image, $event)">
+            <i class="icon-edit"></i>
+          </button>
+          <button class="btn-icon" (click)="deleteImage(image, $event)">
+            <i class="icon-delete"></i>
+          </button>
+        </div>
+      </div>
+      <div class="image-info">
+        <h4 class="image-name">{{ image.name }}</h4>
+        <div class="image-categories">
+          <span *ngFor="let cat of image.categories" 
+                class="category-badge" 
+                [class]="'category-' + cat">
+            {{ getCategoryLabel(cat) }}
+          </span>
+          <span *ngIf="!image.categories || image.categories.length === 0" 
+                class="category-badge category-uncategorized">
+            未分类
+          </span>
+        </div>
+        <p class="image-description" *ngIf="image.description">
+          {{ image.description }}
+        </p>
+        <button class="btn-ai-assist" 
+                *ngIf="!image.description || !image.categories || image.categories.length === 0"
+                (click)="openAIAssistant(image, $event)">
+          <i class="icon-sparkles"></i>
+          AI智能追问
+        </button>
+      </div>
+    </div>
+
+    <!-- 空状态 -->
+    <div class="empty-state" *ngIf="filteredImages.length === 0">
+      <div class="empty-icon">
+        <i class="icon-image"></i>
+      </div>
+      <h3>暂无参考图</h3>
+      <p>点击上传按钮添加参考图,让沟通更清晰</p>
+      <button class="btn-primary" (click)="openUploadDialog()">
+        <i class="icon-upload"></i>
+        上传第一张参考图
+      </button>
+    </div>
+  </div>
+
+  <!-- 列表视图 -->
+  <div class="images-list" *ngIf="viewMode === 'list'">
+    <div class="list-header">
+      <div class="col-preview">预览</div>
+      <div class="col-name">图片名称</div>
+      <div class="col-categories">分类标签</div>
+      <div class="col-description">描述说明</div>
+      <div class="col-actions">操作</div>
+    </div>
+    <div class="list-row" *ngFor="let image of filteredImages" 
+         [class.selected]="selectedImageId === image.id">
+      <div class="col-preview">
+        <img [src]="image.url" [alt]="image.name" (click)="previewImage(image)" />
+      </div>
+      <div class="col-name">{{ image.name }}</div>
+      <div class="col-categories">
+        <span *ngFor="let cat of image.categories" 
+              class="category-badge" 
+              [class]="'category-' + cat">
+          {{ getCategoryLabel(cat) }}
+        </span>
+        <span *ngIf="!image.categories || image.categories.length === 0" 
+              class="category-badge category-uncategorized">
+          未分类
+        </span>
+      </div>
+      <div class="col-description">
+        <p *ngIf="image.description">{{ image.description }}</p>
+        <span class="text-muted" *ngIf="!image.description">暂无描述</span>
+      </div>
+      <div class="col-actions">
+        <button class="btn-icon" (click)="editImage(image, $event)" title="编辑">
+          <i class="icon-edit"></i>
+        </button>
+        <button class="btn-icon" (click)="openAIAssistant(image, $event)" title="AI追问">
+          <i class="icon-sparkles"></i>
+        </button>
+        <button class="btn-icon" (click)="deleteImage(image, $event)" title="删除">
+          <i class="icon-delete"></i>
+        </button>
+      </div>
+    </div>
+
+    <!-- 空状态 -->
+    <div class="empty-state" *ngIf="filteredImages.length === 0">
+      <div class="empty-icon">
+        <i class="icon-image"></i>
+      </div>
+      <h3>暂无{{ getFilterLabel() }}参考图</h3>
+      <p>切换其他分类或上传新的参考图</p>
+    </div>
+  </div>
+
+  <!-- 上传对话框 -->
+  <div class="modal-overlay" *ngIf="showUploadDialog" (click)="closeUploadDialog()">
+    <div class="modal-dialog" (click)="$event.stopPropagation()">
+      <div class="modal-header">
+        <h3>上传参考图</h3>
+        <button class="btn-close" (click)="closeUploadDialog()">
+          <i class="icon-close"></i>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="upload-area" 
+             [class.dragging]="isDragging"
+             (drop)="onDrop($event)"
+             (dragover)="onDragOver($event)"
+             (dragleave)="onDragLeave($event)">
+          <i class="icon-cloud-upload"></i>
+          <p>拖拽图片到此处,或点击选择文件</p>
+          <input type="file" 
+                 #fileInput 
+                 multiple 
+                 accept="image/*" 
+                 (change)="onFileSelected($event)"
+                 style="display: none;" />
+          <button class="btn-select-file" (click)="fileInput.click()">
+            选择文件
+          </button>
+        </div>
+
+        <!-- 已选择的文件列表 -->
+        <div class="selected-files" *ngIf="selectedFiles.length > 0">
+          <h4>已选择 {{ selectedFiles.length }} 个文件</h4>
+          <div class="file-item" *ngFor="let file of selectedFiles; let i = index">
+            <img [src]="file.preview" [alt]="file.name" />
+            <div class="file-info">
+              <p class="file-name">{{ file.name }}</p>
+              <p class="file-size">{{ formatFileSize(file.size) }}</p>
+            </div>
+            <button class="btn-remove" (click)="removeSelectedFile(i)">
+              <i class="icon-close"></i>
+            </button>
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <button class="btn-secondary" (click)="closeUploadDialog()">取消</button>
+        <button class="btn-primary" 
+                [disabled]="selectedFiles.length === 0"
+                (click)="uploadFiles()">
+          <i class="icon-upload"></i>
+          上传 {{ selectedFiles.length }} 张图片
+        </button>
+      </div>
+    </div>
+  </div>
+
+  <!-- 编辑对话框 -->
+  <div class="modal-overlay" *ngIf="showEditDialog" (click)="closeEditDialog()">
+    <div class="modal-dialog modal-dialog-large" (click)="$event.stopPropagation()">
+      <div class="modal-header">
+        <h3>编辑参考图信息</h3>
+        <button class="btn-close" (click)="closeEditDialog()">
+          <i class="icon-close"></i>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="edit-content">
+          <div class="edit-preview">
+            <img [src]="editingImage?.url" [alt]="editingImage?.name" />
+          </div>
+          <div class="edit-form">
+            <div class="form-group">
+              <label>图片名称</label>
+              <input type="text" 
+                     class="form-control" 
+                     [(ngModel)]="editingImage!.name"
+                     placeholder="输入图片名称" />
+            </div>
+
+            <div class="form-group">
+              <label>
+                分类标签
+                <span class="label-tip">可多选</span>
+              </label>
+              <div class="category-checkboxes">
+                <label class="checkbox-label">
+                  <input type="checkbox" 
+                         [checked]="isCategorySelected('lighting')"
+                         (change)="toggleCategory('lighting')" />
+                  <span class="checkbox-text">
+                    <i class="icon-lightbulb"></i>
+                    灯光参考
+                  </span>
+                </label>
+                <label class="checkbox-label">
+                  <input type="checkbox" 
+                         [checked]="isCategorySelected('furniture')"
+                         (change)="toggleCategory('furniture')" />
+                  <span class="checkbox-text">
+                    <i class="icon-couch"></i>
+                    软装参考
+                  </span>
+                </label>
+                <label class="checkbox-label">
+                  <input type="checkbox" 
+                         [checked]="isCategorySelected('atmosphere')"
+                         (change)="toggleCategory('atmosphere')" />
+                  <span class="checkbox-text">
+                    <i class="icon-stars"></i>
+                    氛围参考
+                  </span>
+                </label>
+                <label class="checkbox-label">
+                  <input type="checkbox" 
+                         [checked]="isCategorySelected('structure')"
+                         (change)="toggleCategory('structure')" />
+                  <span class="checkbox-text">
+                    <i class="icon-cube"></i>
+                    结构参考
+                  </span>
+                </label>
+              </div>
+            </div>
+
+            <div class="form-group">
+              <label>
+                描述说明
+                <span class="label-tip">详细描述参考哪些元素</span>
+              </label>
+              <textarea 
+                class="form-control" 
+                rows="4"
+                [(ngModel)]="editingImage!.description"
+                placeholder="例如:参考这张图的灯光布局和氛围感,主要关注吊灯的造型和暖色调灯光的运用..."></textarea>
+            </div>
+
+            <div class="form-group">
+              <label>关键要素标注</label>
+              <div class="tags-input">
+                <span class="tag" *ngFor="let tag of editingImage!.tags; let i = index">
+                  {{ tag }}
+                  <button class="tag-close" (click)="removeTag(i)">×</button>
+                </span>
+                <input type="text" 
+                       class="tag-input"
+                       [(ngModel)]="newTag"
+                       (keydown.enter)="addTag()"
+                       placeholder="输入标签后按回车" />
+              </div>
+              <p class="form-help">例如:吊灯造型、暖色调、木质家具等</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <button class="btn-secondary" (click)="closeEditDialog()">取消</button>
+        <button class="btn-primary" (click)="saveEdit()">
+          <i class="icon-check"></i>
+          保存修改
+        </button>
+      </div>
+    </div>
+  </div>
+
+  <!-- AI智能追问助手 -->
+  <div class="modal-overlay" *ngIf="showAIDialog" (click)="closeAIDialog()">
+    <div class="modal-dialog modal-dialog-ai" (click)="$event.stopPropagation()">
+      <div class="modal-header">
+        <h3>
+          <i class="icon-sparkles"></i>
+          AI智能追问助手
+        </h3>
+        <button class="btn-close" (click)="closeAIDialog()">
+          <i class="icon-close"></i>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="ai-content">
+          <div class="ai-image-preview">
+            <img [src]="aiImage?.url" [alt]="aiImage?.name" />
+            <div class="image-meta">
+              <p class="image-name">{{ aiImage?.name }}</p>
+            </div>
+          </div>
+
+          <div class="ai-analysis">
+            <div class="analysis-section">
+              <h4>
+                <i class="icon-info"></i>
+                当前状态分析
+              </h4>
+              <div class="status-info">
+                <div class="status-item" [class.completed]="aiImage?.categories && (aiImage?.categories?.length ?? 0) > 0">
+                  <i [class.icon-check-circle]="aiImage?.categories && (aiImage?.categories?.length ?? 0) > 0" 
+                     [class.icon-alert-circle]="!aiImage?.categories || (aiImage?.categories?.length ?? 0) === 0"></i>
+                  <span>分类标签:{{ aiImage?.categories && (aiImage?.categories?.length ?? 0) > 0 ? '已标注' : '未标注' }}</span>
+                </div>
+                <div class="status-item" [class.completed]="aiImage?.description">
+                  <i [class.icon-check-circle]="aiImage?.description" 
+                     [class.icon-alert-circle]="!aiImage?.description"></i>
+                  <span>描述说明:{{ aiImage?.description ? '已填写' : '未填写' }}</span>
+                </div>
+              </div>
+            </div>
+
+            <!-- 参考图多的情况 -->
+            <div class="analysis-section" *ngIf="referenceImages.length >= 3">
+              <h4>
+                <i class="icon-help-circle"></i>
+                AI建议追问(参考图较多)
+              </h4>
+              <div class="ai-questions">
+                <div class="question-card" (click)="applyAIQuestion(q)" 
+                     *ngFor="let q of aiQuestionsMultiple">
+                  <div class="question-icon">
+                    <i [class]="q.icon"></i>
+                  </div>
+                  <div class="question-content">
+                    <h5>{{ q.title }}</h5>
+                    <p>{{ q.description }}</p>
+                    <div class="question-example">
+                      <strong>追问示例:</strong>{{ q.example }}
+                    </div>
+                  </div>
+                  <button class="btn-apply">
+                    <i class="icon-arrow-right"></i>
+                  </button>
+                </div>
+              </div>
+            </div>
+
+            <!-- 参考图少的情况 -->
+            <div class="analysis-section" *ngIf="referenceImages.length < 3">
+              <h4>
+                <i class="icon-help-circle"></i>
+                AI建议追问(参考图较少)
+              </h4>
+              <div class="ai-questions">
+                <div class="question-card" (click)="applyAIQuestion(q)" 
+                     *ngFor="let q of aiQuestionsFew">
+                  <div class="question-icon">
+                    <i [class]="q.icon"></i>
+                  </div>
+                  <div class="question-content">
+                    <h5>{{ q.title }}</h5>
+                    <p>{{ q.description }}</p>
+                    <div class="question-example">
+                      <strong>追问示例:</strong>{{ q.example }}
+                    </div>
+                  </div>
+                  <button class="btn-apply">
+                    <i class="icon-arrow-right"></i>
+                  </button>
+                </div>
+              </div>
+            </div>
+
+            <!-- 自定义追问 -->
+            <div class="analysis-section">
+              <h4>
+                <i class="icon-message-circle"></i>
+                自定义追问
+              </h4>
+              <textarea 
+                class="form-control" 
+                rows="3"
+                [(ngModel)]="customQuestion"
+                placeholder="输入您想要补充询问的问题..."></textarea>
+              <button class="btn-send-question" (click)="sendCustomQuestion()">
+                <i class="icon-send"></i>
+                发送追问
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <button class="btn-secondary" (click)="closeAIDialog()">关闭</button>
+        <button class="btn-primary" (click)="applyAISuggestionsAndEdit()">
+          <i class="icon-edit"></i>
+          应用建议并编辑
+        </button>
+      </div>
+    </div>
+  </div>
+
+  <!-- 图片预览对话框 -->
+  <div class="modal-overlay" *ngIf="showPreviewDialog" (click)="closePreviewDialog()">
+    <div class="preview-dialog" (click)="$event.stopPropagation()">
+      <button class="btn-close" (click)="closePreviewDialog()">
+        <i class="icon-close"></i>
+      </button>
+      <img [src]="previewImageUrl" alt="预览图" />
+    </div>
+  </div>
+</div>
+

+ 1249 - 0
src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.scss

@@ -0,0 +1,1249 @@
+@import './icons.scss';
+
+.reference-image-manager {
+  padding: 24px;
+  background: #fff;
+  border-radius: 12px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+
+  // ==================== 顶部标题栏 ====================
+  .manager-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 24px;
+    padding-bottom: 20px;
+    border-bottom: 2px solid #f0f0f0;
+
+    .header-left {
+      display: flex;
+      align-items: center;
+      gap: 16px;
+
+      .manager-title {
+        font-size: 24px;
+        font-weight: 600;
+        color: #1a1a1a;
+        margin: 0;
+        display: flex;
+        align-items: center;
+        gap: 8px;
+
+        i {
+          color: #6366f1;
+          font-size: 28px;
+        }
+      }
+
+      .image-count {
+        padding: 4px 12px;
+        background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+        color: white;
+        border-radius: 20px;
+        font-size: 13px;
+        font-weight: 500;
+      }
+    }
+
+    .header-right {
+      display: flex;
+      gap: 12px;
+
+      .btn-view-mode {
+        padding: 8px 16px;
+        border: 1px solid #e5e7eb;
+        background: white;
+        color: #6b7280;
+        border-radius: 8px;
+        cursor: pointer;
+        font-size: 14px;
+        display: flex;
+        align-items: center;
+        gap: 6px;
+        transition: all 0.3s;
+
+        &:hover {
+          border-color: #6366f1;
+          color: #6366f1;
+          background: #f5f3ff;
+        }
+
+        &.active {
+          background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+          color: white;
+          border-color: transparent;
+        }
+      }
+
+      .btn-upload {
+        padding: 10px 20px;
+        background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+        color: white;
+        border: none;
+        border-radius: 8px;
+        cursor: pointer;
+        font-size: 14px;
+        font-weight: 500;
+        display: flex;
+        align-items: center;
+        gap: 8px;
+        transition: all 0.3s;
+        box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
+
+        &:hover {
+          transform: translateY(-2px);
+          box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
+        }
+
+        &:active {
+          transform: translateY(0);
+        }
+      }
+    }
+  }
+
+  // ==================== 分类筛选标签 ====================
+  .category-filters {
+    display: flex;
+    gap: 12px;
+    margin-bottom: 24px;
+    flex-wrap: wrap;
+
+    .filter-tag {
+      padding: 8px 16px;
+      border: 2px solid #e5e7eb;
+      background: white;
+      color: #6b7280;
+      border-radius: 24px;
+      cursor: pointer;
+      font-size: 14px;
+      font-weight: 500;
+      display: flex;
+      align-items: center;
+      gap: 6px;
+      transition: all 0.3s;
+
+      i {
+        font-size: 16px;
+      }
+
+      &:hover {
+        border-color: #6366f1;
+        background: #f5f3ff;
+        color: #6366f1;
+      }
+
+      &.active {
+        background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+        color: white;
+        border-color: transparent;
+        box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
+      }
+
+      &.filter-tag-lighting.active {
+        background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
+      }
+
+      &.filter-tag-furniture.active {
+        background: linear-gradient(135deg, #10b981 0%, #059669 100%);
+      }
+
+      &.filter-tag-atmosphere.active {
+        background: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
+      }
+
+      &.filter-tag-structure.active {
+        background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
+      }
+
+      &.filter-tag-uncategorized.active {
+        background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
+      }
+    }
+  }
+
+  // ==================== 网格视图 ====================
+  .images-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+    gap: 20px;
+
+    .image-card {
+      background: white;
+      border: 2px solid #f0f0f0;
+      border-radius: 12px;
+      overflow: hidden;
+      cursor: pointer;
+      transition: all 0.3s;
+
+      &:hover {
+        border-color: #6366f1;
+        box-shadow: 0 8px 24px rgba(99, 102, 241, 0.2);
+        transform: translateY(-4px);
+      }
+
+      &.selected {
+        border-color: #6366f1;
+        box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
+      }
+
+      .image-container {
+        position: relative;
+        width: 100%;
+        padding-top: 75%; // 4:3 aspect ratio
+        background: #f9fafb;
+        overflow: hidden;
+
+        img {
+          position: absolute;
+          top: 0;
+          left: 0;
+          width: 100%;
+          height: 100%;
+          object-fit: cover;
+        }
+
+        .image-overlay {
+          position: absolute;
+          top: 0;
+          left: 0;
+          right: 0;
+          bottom: 0;
+          background: rgba(0, 0, 0, 0.6);
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          gap: 12px;
+          opacity: 0;
+          transition: opacity 0.3s;
+
+          .btn-icon {
+            width: 40px;
+            height: 40px;
+            border-radius: 50%;
+            background: white;
+            border: none;
+            color: #6b7280;
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            transition: all 0.3s;
+
+            &:hover {
+              background: #6366f1;
+              color: white;
+              transform: scale(1.1);
+            }
+          }
+        }
+
+        &:hover .image-overlay {
+          opacity: 1;
+        }
+      }
+
+      .image-info {
+        padding: 16px;
+
+        .image-name {
+          font-size: 15px;
+          font-weight: 600;
+          color: #1a1a1a;
+          margin: 0 0 12px 0;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+        }
+
+        .image-categories {
+          display: flex;
+          flex-wrap: wrap;
+          gap: 6px;
+          margin-bottom: 12px;
+
+          .category-badge {
+            padding: 4px 10px;
+            border-radius: 12px;
+            font-size: 12px;
+            font-weight: 500;
+            
+            &.category-lighting {
+              background: #fef3c7;
+              color: #d97706;
+            }
+
+            &.category-furniture {
+              background: #d1fae5;
+              color: #059669;
+            }
+
+            &.category-atmosphere {
+              background: #fce7f3;
+              color: #db2777;
+            }
+
+            &.category-structure {
+              background: #dbeafe;
+              color: #2563eb;
+            }
+
+            &.category-uncategorized {
+              background: #fee2e2;
+              color: #dc2626;
+            }
+          }
+        }
+
+        .image-description {
+          font-size: 13px;
+          color: #6b7280;
+          line-height: 1.5;
+          margin: 0 0 12px 0;
+          display: -webkit-box;
+          -webkit-line-clamp: 2;
+          line-clamp: 2;
+          -webkit-box-orient: vertical;
+          overflow: hidden;
+        }
+
+        .btn-ai-assist {
+          width: 100%;
+          padding: 8px 12px;
+          background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
+          color: white;
+          border: none;
+          border-radius: 6px;
+          cursor: pointer;
+          font-size: 13px;
+          font-weight: 500;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          gap: 6px;
+          transition: all 0.3s;
+
+          &:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);
+          }
+
+          i {
+            font-size: 16px;
+          }
+        }
+      }
+    }
+  }
+
+  // ==================== 列表视图 ====================
+  .images-list {
+    .list-header {
+      display: grid;
+      grid-template-columns: 100px 1fr 200px 2fr 120px;
+      gap: 16px;
+      padding: 12px 16px;
+      background: #f9fafb;
+      border-radius: 8px;
+      font-size: 13px;
+      font-weight: 600;
+      color: #6b7280;
+      margin-bottom: 12px;
+    }
+
+    .list-row {
+      display: grid;
+      grid-template-columns: 100px 1fr 200px 2fr 120px;
+      gap: 16px;
+      padding: 16px;
+      background: white;
+      border: 2px solid #f0f0f0;
+      border-radius: 8px;
+      margin-bottom: 12px;
+      align-items: center;
+      transition: all 0.3s;
+
+      &:hover {
+        border-color: #6366f1;
+        box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15);
+      }
+
+      &.selected {
+        border-color: #6366f1;
+        background: #f5f3ff;
+      }
+
+      .col-preview {
+        img {
+          width: 80px;
+          height: 60px;
+          object-fit: cover;
+          border-radius: 6px;
+          cursor: pointer;
+          transition: transform 0.3s;
+
+          &:hover {
+            transform: scale(1.1);
+          }
+        }
+      }
+
+      .col-name {
+        font-size: 14px;
+        font-weight: 500;
+        color: #1a1a1a;
+      }
+
+      .col-categories {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 6px;
+
+        .category-badge {
+          padding: 4px 10px;
+          border-radius: 12px;
+          font-size: 12px;
+          font-weight: 500;
+          
+          &.category-lighting {
+            background: #fef3c7;
+            color: #d97706;
+          }
+
+          &.category-furniture {
+            background: #d1fae5;
+            color: #059669;
+          }
+
+          &.category-atmosphere {
+            background: #fce7f3;
+            color: #db2777;
+          }
+
+          &.category-structure {
+            background: #dbeafe;
+            color: #2563eb;
+          }
+
+          &.category-uncategorized {
+            background: #fee2e2;
+            color: #dc2626;
+          }
+        }
+      }
+
+      .col-description {
+        p {
+          font-size: 13px;
+          color: #6b7280;
+          line-height: 1.5;
+          margin: 0;
+          display: -webkit-box;
+          -webkit-line-clamp: 2;
+          line-clamp: 2;
+          -webkit-box-orient: vertical;
+          overflow: hidden;
+        }
+
+        .text-muted {
+          color: #9ca3af;
+          font-size: 13px;
+        }
+      }
+
+      .col-actions {
+        display: flex;
+        gap: 8px;
+        justify-content: flex-end;
+
+        .btn-icon {
+          width: 36px;
+          height: 36px;
+          border-radius: 6px;
+          background: #f3f4f6;
+          border: none;
+          color: #6b7280;
+          cursor: pointer;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          transition: all 0.3s;
+
+          &:hover {
+            background: #6366f1;
+            color: white;
+          }
+        }
+      }
+    }
+  }
+
+  // ==================== 空状态 ====================
+  .empty-state {
+    text-align: center;
+    padding: 60px 20px;
+
+    .empty-icon {
+      i {
+        font-size: 64px;
+        color: #d1d5db;
+      }
+    }
+
+    h3 {
+      font-size: 20px;
+      font-weight: 600;
+      color: #6b7280;
+      margin: 20px 0 8px 0;
+    }
+
+    p {
+      font-size: 14px;
+      color: #9ca3af;
+      margin: 0 0 24px 0;
+    }
+
+    .btn-primary {
+      padding: 12px 24px;
+      background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+      color: white;
+      border: none;
+      border-radius: 8px;
+      cursor: pointer;
+      font-size: 14px;
+      font-weight: 500;
+      display: inline-flex;
+      align-items: center;
+      gap: 8px;
+      transition: all 0.3s;
+
+      &:hover {
+        transform: translateY(-2px);
+        box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
+      }
+    }
+  }
+
+  // ==================== 对话框样式 ====================
+  .modal-overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.6);
+    backdrop-filter: blur(4px);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    z-index: 1000;
+    animation: fadeIn 0.3s;
+  }
+
+  @keyframes fadeIn {
+    from {
+      opacity: 0;
+    }
+    to {
+      opacity: 1;
+    }
+  }
+
+  .modal-dialog {
+    background: white;
+    border-radius: 16px;
+    width: 90%;
+    max-width: 600px;
+    max-height: 90vh;
+    overflow: hidden;
+    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+    animation: slideUp 0.3s;
+
+    &.modal-dialog-large {
+      max-width: 900px;
+    }
+
+    &.modal-dialog-ai {
+      max-width: 1000px;
+    }
+  }
+
+  @keyframes slideUp {
+    from {
+      transform: translateY(20px);
+      opacity: 0;
+    }
+    to {
+      transform: translateY(0);
+      opacity: 1;
+    }
+  }
+
+  .modal-header {
+    padding: 24px;
+    border-bottom: 1px solid #e5e7eb;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    h3 {
+      font-size: 20px;
+      font-weight: 600;
+      color: #1a1a1a;
+      margin: 0;
+      display: flex;
+      align-items: center;
+      gap: 8px;
+
+      i {
+        color: #6366f1;
+      }
+    }
+
+    .btn-close {
+      width: 32px;
+      height: 32px;
+      border-radius: 6px;
+      background: #f3f4f6;
+      border: none;
+      color: #6b7280;
+      cursor: pointer;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      transition: all 0.3s;
+
+      &:hover {
+        background: #ef4444;
+        color: white;
+      }
+    }
+  }
+
+  .modal-body {
+    padding: 24px;
+    max-height: calc(90vh - 160px);
+    overflow-y: auto;
+
+    &::-webkit-scrollbar {
+      width: 8px;
+    }
+
+    &::-webkit-scrollbar-track {
+      background: #f3f4f6;
+      border-radius: 4px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      background: #d1d5db;
+      border-radius: 4px;
+
+      &:hover {
+        background: #9ca3af;
+      }
+    }
+  }
+
+  .modal-footer {
+    padding: 16px 24px;
+    border-top: 1px solid #e5e7eb;
+    display: flex;
+    justify-content: flex-end;
+    gap: 12px;
+
+    button {
+      padding: 10px 20px;
+      border-radius: 8px;
+      font-size: 14px;
+      font-weight: 500;
+      cursor: pointer;
+      transition: all 0.3s;
+
+      &.btn-secondary {
+        background: #f3f4f6;
+        color: #6b7280;
+        border: none;
+
+        &:hover {
+          background: #e5e7eb;
+        }
+      }
+
+      &.btn-primary {
+        background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+        color: white;
+        border: none;
+        display: flex;
+        align-items: center;
+        gap: 6px;
+
+        &:hover {
+          transform: translateY(-2px);
+          box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
+        }
+
+        &:disabled {
+          opacity: 0.5;
+          cursor: not-allowed;
+          transform: none;
+        }
+      }
+    }
+  }
+
+  // ==================== 上传区域 ====================
+  .upload-area {
+    border: 2px dashed #d1d5db;
+    border-radius: 12px;
+    padding: 48px 24px;
+    text-align: center;
+    transition: all 0.3s;
+
+    &.dragging {
+      border-color: #6366f1;
+      background: #f5f3ff;
+    }
+
+    i {
+      font-size: 48px;
+      color: #9ca3af;
+      display: block;
+      margin-bottom: 16px;
+    }
+
+    p {
+      font-size: 14px;
+      color: #6b7280;
+      margin: 0 0 16px 0;
+    }
+
+    .btn-select-file {
+      padding: 10px 20px;
+      background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+      color: white;
+      border: none;
+      border-radius: 8px;
+      cursor: pointer;
+      font-size: 14px;
+      font-weight: 500;
+      transition: all 0.3s;
+
+      &:hover {
+        transform: translateY(-2px);
+        box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
+      }
+    }
+  }
+
+  .selected-files {
+    margin-top: 24px;
+
+    h4 {
+      font-size: 16px;
+      font-weight: 600;
+      color: #1a1a1a;
+      margin: 0 0 16px 0;
+    }
+
+    .file-item {
+      display: flex;
+      align-items: center;
+      gap: 12px;
+      padding: 12px;
+      background: #f9fafb;
+      border-radius: 8px;
+      margin-bottom: 8px;
+
+      img {
+        width: 60px;
+        height: 45px;
+        object-fit: cover;
+        border-radius: 4px;
+      }
+
+      .file-info {
+        flex: 1;
+
+        .file-name {
+          font-size: 14px;
+          font-weight: 500;
+          color: #1a1a1a;
+          margin: 0 0 4px 0;
+        }
+
+        .file-size {
+          font-size: 12px;
+          color: #9ca3af;
+          margin: 0;
+        }
+      }
+
+      .btn-remove {
+        width: 28px;
+        height: 28px;
+        border-radius: 4px;
+        background: #fee2e2;
+        border: none;
+        color: #dc2626;
+        cursor: pointer;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        transition: all 0.3s;
+
+        &:hover {
+          background: #dc2626;
+          color: white;
+        }
+      }
+    }
+  }
+
+  // ==================== 编辑表单 ====================
+  .edit-content {
+    display: grid;
+    grid-template-columns: 300px 1fr;
+    gap: 24px;
+
+    .edit-preview {
+      img {
+        width: 100%;
+        border-radius: 8px;
+      }
+    }
+
+    .edit-form {
+      .form-group {
+        margin-bottom: 20px;
+
+        label {
+          display: block;
+          font-size: 14px;
+          font-weight: 600;
+          color: #374151;
+          margin-bottom: 8px;
+
+          .label-tip {
+            font-size: 12px;
+            font-weight: 400;
+            color: #9ca3af;
+            margin-left: 8px;
+          }
+        }
+
+        .form-control {
+          width: 100%;
+          padding: 10px 12px;
+          border: 1px solid #d1d5db;
+          border-radius: 8px;
+          font-size: 14px;
+          color: #1a1a1a;
+          transition: all 0.3s;
+          font-family: inherit;
+
+          &:focus {
+            outline: none;
+            border-color: #6366f1;
+            box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
+          }
+        }
+
+        .category-checkboxes {
+          display: grid;
+          grid-template-columns: 1fr 1fr;
+          gap: 12px;
+
+          .checkbox-label {
+            display: flex;
+            align-items: center;
+            gap: 8px;
+            cursor: pointer;
+            padding: 10px 12px;
+            border: 2px solid #e5e7eb;
+            border-radius: 8px;
+            transition: all 0.3s;
+
+            &:hover {
+              border-color: #6366f1;
+              background: #f5f3ff;
+            }
+
+            input[type="checkbox"] {
+              cursor: pointer;
+
+              &:checked + .checkbox-text {
+                color: #6366f1;
+                font-weight: 600;
+              }
+            }
+
+            .checkbox-text {
+              display: flex;
+              align-items: center;
+              gap: 6px;
+              font-size: 14px;
+              color: #6b7280;
+              transition: all 0.3s;
+
+              i {
+                font-size: 16px;
+              }
+            }
+          }
+        }
+
+        .tags-input {
+          display: flex;
+          flex-wrap: wrap;
+          gap: 8px;
+          padding: 8px;
+          border: 1px solid #d1d5db;
+          border-radius: 8px;
+          min-height: 42px;
+          transition: all 0.3s;
+
+          &:focus-within {
+            border-color: #6366f1;
+            box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
+          }
+
+          .tag {
+            padding: 4px 10px;
+            background: #6366f1;
+            color: white;
+            border-radius: 12px;
+            font-size: 13px;
+            display: flex;
+            align-items: center;
+            gap: 6px;
+
+            .tag-close {
+              background: none;
+              border: none;
+              color: white;
+              cursor: pointer;
+              font-size: 16px;
+              line-height: 1;
+              padding: 0;
+              width: 16px;
+              height: 16px;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+
+              &:hover {
+                opacity: 0.8;
+              }
+            }
+          }
+
+          .tag-input {
+            flex: 1;
+            border: none;
+            outline: none;
+            font-size: 14px;
+            min-width: 120px;
+            padding: 4px 0;
+          }
+        }
+
+        .form-help {
+          font-size: 12px;
+          color: #9ca3af;
+          margin: 6px 0 0 0;
+        }
+      }
+    }
+  }
+
+  // ==================== AI助手 ====================
+  .ai-content {
+    display: grid;
+    grid-template-columns: 280px 1fr;
+    gap: 24px;
+
+    .ai-image-preview {
+      img {
+        width: 100%;
+        border-radius: 8px;
+        margin-bottom: 12px;
+      }
+
+      .image-meta {
+        .image-name {
+          font-size: 14px;
+          font-weight: 500;
+          color: #6b7280;
+          margin: 0;
+        }
+      }
+    }
+
+    .ai-analysis {
+      .analysis-section {
+        margin-bottom: 24px;
+
+        h4 {
+          font-size: 16px;
+          font-weight: 600;
+          color: #1a1a1a;
+          margin: 0 0 16px 0;
+          display: flex;
+          align-items: center;
+          gap: 8px;
+
+          i {
+            color: #6366f1;
+          }
+        }
+
+        .status-info {
+          .status-item {
+            display: flex;
+            align-items: center;
+            gap: 8px;
+            padding: 10px 12px;
+            background: #f9fafb;
+            border-radius: 8px;
+            margin-bottom: 8px;
+            font-size: 14px;
+
+            i {
+              font-size: 18px;
+              color: #ef4444;
+
+              &.icon-check-circle {
+                color: #10b981;
+              }
+
+              &.icon-alert-circle {
+                color: #ef4444;
+              }
+            }
+
+            &.completed {
+              background: #d1fae5;
+              color: #059669;
+            }
+          }
+        }
+
+        .ai-questions {
+          .question-card {
+            display: flex;
+            align-items: flex-start;
+            gap: 12px;
+            padding: 16px;
+            background: white;
+            border: 2px solid #e5e7eb;
+            border-radius: 12px;
+            margin-bottom: 12px;
+            cursor: pointer;
+            transition: all 0.3s;
+
+            &:hover {
+              border-color: #6366f1;
+              background: #f5f3ff;
+              transform: translateX(4px);
+
+              .btn-apply {
+                background: #6366f1;
+                color: white;
+              }
+            }
+
+            .question-icon {
+              width: 40px;
+              height: 40px;
+              border-radius: 10px;
+              background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+              color: white;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              flex-shrink: 0;
+
+              i {
+                font-size: 20px;
+              }
+            }
+
+            .question-content {
+              flex: 1;
+
+              h5 {
+                font-size: 15px;
+                font-weight: 600;
+                color: #1a1a1a;
+                margin: 0 0 6px 0;
+              }
+
+              p {
+                font-size: 13px;
+                color: #6b7280;
+                margin: 0 0 10px 0;
+                line-height: 1.5;
+              }
+
+              .question-example {
+                padding: 10px 12px;
+                background: #f9fafb;
+                border-left: 3px solid #6366f1;
+                border-radius: 6px;
+                font-size: 13px;
+                color: #374151;
+                line-height: 1.5;
+
+                strong {
+                  color: #6366f1;
+                  font-weight: 600;
+                  display: block;
+                  margin-bottom: 4px;
+                }
+              }
+            }
+
+            .btn-apply {
+              width: 32px;
+              height: 32px;
+              border-radius: 6px;
+              background: #f3f4f6;
+              border: none;
+              color: #6b7280;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              transition: all 0.3s;
+              flex-shrink: 0;
+            }
+          }
+        }
+
+        .btn-send-question {
+          margin-top: 12px;
+          width: 100%;
+          padding: 12px;
+          background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
+          color: white;
+          border: none;
+          border-radius: 8px;
+          cursor: pointer;
+          font-size: 14px;
+          font-weight: 500;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          gap: 8px;
+          transition: all 0.3s;
+
+          &:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
+          }
+        }
+      }
+    }
+  }
+
+  // ==================== 图片预览 ====================
+  .preview-dialog {
+    position: relative;
+    max-width: 90vw;
+    max-height: 90vh;
+
+    .btn-close {
+      position: absolute;
+      top: -40px;
+      right: 0;
+      width: 40px;
+      height: 40px;
+      border-radius: 50%;
+      background: rgba(255, 255, 255, 0.9);
+      border: none;
+      color: #1a1a1a;
+      cursor: pointer;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      transition: all 0.3s;
+
+      &:hover {
+        background: #ef4444;
+        color: white;
+        transform: rotate(90deg);
+      }
+    }
+
+    img {
+      max-width: 100%;
+      max-height: 90vh;
+      border-radius: 8px;
+      box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+    }
+  }
+
+  // ==================== 响应式设计 ====================
+  @media (max-width: 1024px) {
+    .images-grid {
+      grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+    }
+
+    .edit-content {
+      grid-template-columns: 1fr;
+
+      .edit-preview {
+        img {
+          max-width: 300px;
+          margin: 0 auto;
+          display: block;
+        }
+      }
+    }
+
+    .ai-content {
+      grid-template-columns: 1fr;
+    }
+  }
+
+  @media (max-width: 768px) {
+    padding: 16px;
+
+    .manager-header {
+      flex-direction: column;
+      align-items: flex-start;
+      gap: 16px;
+
+      .header-right {
+        width: 100%;
+        
+        .btn-view-mode,
+        .btn-upload {
+          flex: 1;
+        }
+      }
+    }
+
+    .images-grid {
+      grid-template-columns: 1fr;
+    }
+
+    .images-list {
+      .list-header {
+        display: none;
+      }
+
+      .list-row {
+        grid-template-columns: 1fr;
+        gap: 12px;
+
+        .col-preview {
+          img {
+            width: 100%;
+            height: auto;
+          }
+        }
+      }
+    }
+  }
+}
+

+ 475 - 0
src/app/pages/designer/project-detail/components/reference-image-manager/reference-image-manager.component.ts

@@ -0,0 +1,475 @@
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+interface ReferenceImage {
+  id: string;
+  name: string;
+  url: string;
+  categories: string[];
+  description?: string;
+  tags?: string[];
+  uploadDate: Date;
+}
+
+interface SelectedFile {
+  file: File;
+  name: string;
+  size: number;
+  preview: string;
+}
+
+interface AIQuestion {
+  id: string;
+  title: string;
+  description: string;
+  example: string;
+  icon: string;
+  category?: string;
+}
+
+@Component({
+  selector: 'app-reference-image-manager',
+  standalone: true,
+  imports: [CommonModule, FormsModule],
+  templateUrl: './reference-image-manager.component.html',
+  styleUrls: ['./reference-image-manager.component.scss']
+})
+export class ReferenceImageManagerComponent implements OnInit {
+  @Input() projectId: string = '';
+  @Output() imagesUpdated = new EventEmitter<ReferenceImage[]>();
+
+  // 视图状态
+  viewMode: 'grid' | 'list' = 'grid';
+  activeFilter: string = 'all';
+  selectedImageId: string | null = null;
+
+  // 数据
+  referenceImages: ReferenceImage[] = [];
+  filteredImages: ReferenceImage[] = [];
+
+  // 对话框状态
+  showUploadDialog = false;
+  showEditDialog = false;
+  showAIDialog = false;
+  showPreviewDialog = false;
+
+  // 上传相关
+  isDragging = false;
+  selectedFiles: SelectedFile[] = [];
+
+  // 编辑相关
+  editingImage: ReferenceImage | null = null;
+  newTag = '';
+
+  // AI助手相关
+  aiImage: ReferenceImage | null = null;
+  customQuestion = '';
+
+  // AI建议追问(参考图多的情况)
+  aiQuestionsMultiple: AIQuestion[] = [
+    {
+      id: 'q1',
+      title: '明确灯光参考',
+      description: '当有多张参考图时,需要明确哪张图主要用于灯光布局参考',
+      example: '请问这几张参考图中,哪一张是您想要的灯光效果?主要参考它的主光源布置还是氛围灯效果?',
+      icon: 'icon-lightbulb',
+      category: 'lighting'
+    },
+    {
+      id: 'q2',
+      title: '区分软装参考',
+      description: '识别哪些图片用于软装家具的参考',
+      example: '这些参考图中,哪几张是用于软装搭配的?具体是参考家具的款式、颜色还是整体搭配方案?',
+      icon: 'icon-couch',
+      category: 'furniture'
+    },
+    {
+      id: 'q3',
+      title: '确认氛围感觉',
+      description: '明确整体氛围和感觉的主要参考图',
+      example: '您希望达到的整体氛围感觉,主要是参考哪张图?是温馨、现代还是其他风格?',
+      icon: 'icon-stars',
+      category: 'atmosphere'
+    },
+    {
+      id: 'q4',
+      title: '结构布局说明',
+      description: '确认空间结构和布局的参考依据',
+      example: '空间的布局结构,是按照哪张图来的?需要完全一致还是可以适当调整?',
+      icon: 'icon-cube',
+      category: 'structure'
+    }
+  ];
+
+  // AI建议追问(参考图少的情况)
+  aiQuestionsFew: AIQuestion[] = [
+    {
+      id: 'q5',
+      title: '细化感觉来源',
+      description: '深入了解客户喜欢这张图的具体原因',
+      example: '您喜欢这张图的哪些方面?是整体的色调、光线效果、还是家具的搭配?能具体说说吗?',
+      icon: 'icon-heart',
+    },
+    {
+      id: 'q6',
+      title: '明确重点元素',
+      description: '确认图片中最重要的参考元素',
+      example: '这张图里,您最想要的是什么?比如墙面的颜色、地板材质、还是家具的款式?请按重要性排个序。',
+      icon: 'icon-target',
+    },
+    {
+      id: 'q7',
+      title: '探索细节要求',
+      description: '挖掘客户对细节的具体期望',
+      example: '关于这张图的细节,比如灯具的样式、窗帘的材质、墙面的装饰等,您有特别的偏好吗?',
+      icon: 'icon-zoom-in',
+    },
+    {
+      id: 'q8',
+      title: '确认可调整空间',
+      description: '了解哪些地方可以灵活调整',
+      example: '如果完全按这张图来可能有些困难,哪些元素是必须保留的?哪些可以根据实际情况调整?',
+      icon: 'icon-sliders',
+    }
+  ];
+
+  previewImageUrl = '';
+
+  ngOnInit() {
+    this.loadReferenceImages();
+  }
+
+  // 加载参考图数据
+  loadReferenceImages() {
+    // 模拟数据,实际应该从服务器加载
+    this.referenceImages = [
+      {
+        id: '1',
+        name: '客厅灯光参考.jpg',
+        url: '/assets/images/portfolio-1.svg',
+        categories: ['lighting', 'atmosphere'],
+        description: '参考主灯和氛围灯的布局,营造温馨的晚间氛围',
+        tags: ['吊灯', '暖光', '氛围灯'],
+        uploadDate: new Date('2024-01-15')
+      },
+      {
+        id: '2',
+        name: '软装搭配方案.jpg',
+        url: '/assets/images/portfolio-2.svg',
+        categories: ['furniture'],
+        description: '参考沙发、茶几的款式和颜色搭配',
+        tags: ['现代简约', '布艺沙发', '木质茶几'],
+        uploadDate: new Date('2024-01-16')
+      },
+      {
+        id: '3',
+        name: '整体效果图.jpg',
+        url: '/assets/images/portfolio-3.svg',
+        categories: [],
+        description: '',
+        tags: [],
+        uploadDate: new Date('2024-01-17')
+      }
+    ];
+    this.filteredImages = [...this.referenceImages];
+  }
+
+  // 分类筛选
+  filterByCategory(category: string) {
+    this.activeFilter = category;
+    if (category === 'all') {
+      this.filteredImages = [...this.referenceImages];
+    } else if (category === 'uncategorized') {
+      this.filteredImages = this.referenceImages.filter(img => 
+        !img.categories || img.categories.length === 0
+      );
+    } else {
+      this.filteredImages = this.referenceImages.filter(img => 
+        img.categories && img.categories.includes(category)
+      );
+    }
+  }
+
+  // 获取分类数量
+  getCategoryCount(category: string): number {
+    return this.referenceImages.filter(img => 
+      img.categories && img.categories.includes(category)
+    ).length;
+  }
+
+  // 获取未分类数量
+  getUncategorizedCount(): number {
+    return this.referenceImages.filter(img => 
+      !img.categories || img.categories.length === 0
+    ).length;
+  }
+
+  // 获取分类标签文本
+  getCategoryLabel(category: string): string {
+    const labels: { [key: string]: string } = {
+      'lighting': '灯光',
+      'furniture': '软装',
+      'atmosphere': '氛围',
+      'structure': '结构'
+    };
+    return labels[category] || category;
+  }
+
+  // 获取筛选器标签
+  getFilterLabel(): string {
+    const labels: { [key: string]: string } = {
+      'all': '全部',
+      'lighting': '灯光参考',
+      'furniture': '软装参考',
+      'atmosphere': '氛围参考',
+      'structure': '结构参考',
+      'uncategorized': '未分类'
+    };
+    return labels[this.activeFilter] || '';
+  }
+
+  // 选择图片
+  selectImage(image: ReferenceImage) {
+    this.selectedImageId = image.id;
+  }
+
+  // 打开上传对话框
+  openUploadDialog() {
+    this.showUploadDialog = true;
+    this.selectedFiles = [];
+  }
+
+  // 关闭上传对话框
+  closeUploadDialog() {
+    this.showUploadDialog = false;
+    this.selectedFiles = [];
+  }
+
+  // 文件拖拽
+  onDragOver(event: DragEvent) {
+    event.preventDefault();
+    this.isDragging = true;
+  }
+
+  onDragLeave(event: DragEvent) {
+    event.preventDefault();
+    this.isDragging = false;
+  }
+
+  onDrop(event: DragEvent) {
+    event.preventDefault();
+    this.isDragging = false;
+    
+    const files = event.dataTransfer?.files;
+    if (files) {
+      this.processFiles(files);
+    }
+  }
+
+  // 文件选择
+  onFileSelected(event: Event) {
+    const input = event.target as HTMLInputElement;
+    if (input.files) {
+      this.processFiles(input.files);
+    }
+  }
+
+  // 处理文件
+  processFiles(files: FileList) {
+    for (let i = 0; i < files.length; i++) {
+      const file = files[i];
+      if (file.type.startsWith('image/')) {
+        const reader = new FileReader();
+        reader.onload = (e) => {
+          this.selectedFiles.push({
+            file: file,
+            name: file.name,
+            size: file.size,
+            preview: e.target?.result as string
+          });
+        };
+        reader.readAsDataURL(file);
+      }
+    }
+  }
+
+  // 移除选中的文件
+  removeSelectedFile(index: number) {
+    this.selectedFiles.splice(index, 1);
+  }
+
+  // 格式化文件大小
+  formatFileSize(bytes: number): string {
+    if (bytes < 1024) return bytes + ' B';
+    if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
+    return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
+  }
+
+  // 上传文件
+  uploadFiles() {
+    // 模拟上传
+    this.selectedFiles.forEach(file => {
+      const newImage: ReferenceImage = {
+        id: Date.now().toString() + Math.random(),
+        name: file.name,
+        url: file.preview,
+        categories: [],
+        description: '',
+        tags: [],
+        uploadDate: new Date()
+      };
+      this.referenceImages.unshift(newImage);
+    });
+    
+    this.filteredImages = [...this.referenceImages];
+    this.imagesUpdated.emit(this.referenceImages);
+    this.closeUploadDialog();
+  }
+
+  // 编辑图片
+  editImage(image: ReferenceImage, event: Event) {
+    event.stopPropagation();
+    this.editingImage = { ...image };
+    this.showEditDialog = true;
+  }
+
+  // 关闭编辑对话框
+  closeEditDialog() {
+    this.showEditDialog = false;
+    this.editingImage = null;
+  }
+
+  // 判断分类是否选中
+  isCategorySelected(category: string): boolean {
+    return this.editingImage?.categories?.includes(category) || false;
+  }
+
+  // 切换分类
+  toggleCategory(category: string) {
+    if (!this.editingImage) return;
+    
+    if (!this.editingImage.categories) {
+      this.editingImage.categories = [];
+    }
+
+    const index = this.editingImage.categories.indexOf(category);
+    if (index > -1) {
+      this.editingImage.categories.splice(index, 1);
+    } else {
+      this.editingImage.categories.push(category);
+    }
+  }
+
+  // 添加标签
+  addTag() {
+    if (!this.editingImage || !this.newTag.trim()) return;
+    
+    if (!this.editingImage.tags) {
+      this.editingImage.tags = [];
+    }
+
+    if (!this.editingImage.tags.includes(this.newTag.trim())) {
+      this.editingImage.tags.push(this.newTag.trim());
+    }
+    this.newTag = '';
+  }
+
+  // 移除标签
+  removeTag(index: number) {
+    if (this.editingImage?.tags) {
+      this.editingImage.tags.splice(index, 1);
+    }
+  }
+
+  // 保存编辑
+  saveEdit() {
+    if (!this.editingImage) return;
+
+    const index = this.referenceImages.findIndex(img => img.id === this.editingImage!.id);
+    if (index > -1) {
+      this.referenceImages[index] = { ...this.editingImage };
+      this.filterByCategory(this.activeFilter);
+      this.imagesUpdated.emit(this.referenceImages);
+    }
+
+    this.closeEditDialog();
+  }
+
+  // 删除图片
+  deleteImage(image: ReferenceImage, event: Event) {
+    event.stopPropagation();
+    
+    if (confirm(`确定要删除 "${image.name}" 吗?`)) {
+      this.referenceImages = this.referenceImages.filter(img => img.id !== image.id);
+      this.filterByCategory(this.activeFilter);
+      this.imagesUpdated.emit(this.referenceImages);
+    }
+  }
+
+  // 打开AI助手
+  openAIAssistant(image: ReferenceImage, event: Event) {
+    event.stopPropagation();
+    this.aiImage = { ...image };
+    this.showAIDialog = true;
+  }
+
+  // 关闭AI对话框
+  closeAIDialog() {
+    this.showAIDialog = false;
+    this.aiImage = null;
+    this.customQuestion = '';
+  }
+
+  // 应用AI建议的问题
+  applyAIQuestion(question: AIQuestion) {
+    // 这里可以实现将问题发送给客户的逻辑
+    console.log('应用AI问题:', question);
+    
+    // 如果问题有关联的分类,自动添加到图片分类中
+    if (question.category && this.aiImage) {
+      if (!this.aiImage.categories) {
+        this.aiImage.categories = [];
+      }
+      if (!this.aiImage.categories.includes(question.category)) {
+        this.aiImage.categories.push(question.category);
+      }
+    }
+
+    alert(`已将追问发送给客户:\n\n${question.example}`);
+  }
+
+  // 发送自定义问题
+  sendCustomQuestion() {
+    if (!this.customQuestion.trim()) {
+      alert('请输入追问内容');
+      return;
+    }
+
+    // 这里实现发送自定义问题的逻辑
+    console.log('发送自定义问题:', this.customQuestion);
+    alert(`已将追问发送给客户:\n\n${this.customQuestion}`);
+    this.customQuestion = '';
+  }
+
+  // 应用AI建议并编辑
+  applyAISuggestionsAndEdit() {
+    if (this.aiImage) {
+      this.closeAIDialog();
+      this.editImage(this.aiImage, new Event('click'));
+    }
+  }
+
+  // 预览图片
+  previewImage(image: ReferenceImage) {
+    this.previewImageUrl = image.url;
+    this.showPreviewDialog = true;
+  }
+
+  // 关闭预览
+  closePreviewDialog() {
+    this.showPreviewDialog = false;
+    this.previewImageUrl = '';
+  }
+}
+

+ 1 - 1
src/app/pages/designer/project-detail/debug-styles.scss

@@ -1496,7 +1496,7 @@
   background: #ff4d4f !important;
 }
 
-/* 订单创建阶段完成后的绿色高亮 */
+/* 订单分配阶段完成后的绿色高亮 */
 .vertical-stage-block.completed {
   background: #f6ffed !important;
   border-color: #b7eb8f !important;

+ 1 - 1
src/app/pages/designer/project-detail/order-creation-form.scss

@@ -1,4 +1,4 @@
-/* 订单创建表单样式 */
+/* 订单分配表单样式 */
 .order-creation-form {
   background: #ffffff;
   border-radius: 16px;

+ 45 - 24
src/app/pages/designer/project-detail/project-detail.html

@@ -34,31 +34,43 @@
         <div class="stage-nav-item" 
              [class.completed]="getSectionStatus('order') === 'completed'" 
              [class.active]="getSectionStatus('order') === 'active'"
-             (click)="toggleSection('order')">
+             [class.readonly]="isReviewOnlyMode"
+             (click)="!isReviewOnlyMode && toggleSection('order')">
           <div class="stage-nav-circle">
             <span class="stage-nav-number">1</span>
           </div>
-          <div class="stage-nav-label">订单创建</div>
+          <div class="stage-nav-label">订单分配</div>
+          @if (isReviewOnlyMode) {
+            <div class="readonly-badge">只读</div>
+          }
         </div>
         <div class="stage-nav-connector" [class.completed]="getSectionStatus('requirements') === 'completed' || getSectionStatus('requirements') === 'active'"></div>
         <div class="stage-nav-item" 
              [class.completed]="getSectionStatus('requirements') === 'completed'" 
              [class.active]="getSectionStatus('requirements') === 'active'"
-             (click)="toggleSection('requirements')">
+             [class.readonly]="isReviewOnlyMode"
+             (click)="!isReviewOnlyMode && toggleSection('requirements')">
           <div class="stage-nav-circle">
             <span class="stage-nav-number">2</span>
           </div>
           <div class="stage-nav-label">确认需求</div>
+          @if (isReviewOnlyMode) {
+            <div class="readonly-badge">只读</div>
+          }
         </div>
         <div class="stage-nav-connector" [class.completed]="getSectionStatus('delivery') === 'completed' || getSectionStatus('delivery') === 'active'"></div>
         <div class="stage-nav-item" 
              [class.completed]="getSectionStatus('delivery') === 'completed'" 
              [class.active]="getSectionStatus('delivery') === 'active'"
-             (click)="toggleSection('delivery')">
+             [class.readonly]="isReviewOnlyMode"
+             (click)="!isReviewOnlyMode && toggleSection('delivery')">
           <div class="stage-nav-circle">
             <span class="stage-nav-number">3</span>
           </div>
           <div class="stage-nav-label">交付执行</div>
+          @if (isReviewOnlyMode) {
+            <div class="readonly-badge">只读</div>
+          }
         </div>
         <div class="stage-nav-connector" [class.completed]="getSectionStatus('aftercare') === 'completed' || getSectionStatus('aftercare') === 'active'"></div>
         <div class="stage-nav-item" 
@@ -260,7 +272,7 @@
               </div>
               @if (project) {
                 <div class="info-grid" [class.collapsed]="!isCustomerInfoExpanded">
-                  <!-- 显示订单创建时填写的客户信息,如果有的话 -->
+                  <!-- 显示订单分配时填写的客户信息,如果有的话 -->
                   @if (orderCreationData?.customerInfo) {
                     <!-- 基本客户信息 -->
                     <div class="info-item key-info"><label>客户姓名</label><span>{{ orderCreationData.customerInfo.name }}</span></div>
@@ -662,7 +674,18 @@
               
               <!-- 新增:客户信息右侧 2x2 售后模块布局 -->
               @if (expandedSection === 'aftercare') {
-              <!-- 上方 2x2 网格:前4个模块 -->
+              <!-- 只读复盘模式提示 -->
+              @if (isReviewOnlyMode) {
+                <div class="review-only-notice">
+                  <div class="notice-icon">👁️</div>
+                  <div class="notice-content">
+                    <h4>只读复盘模式</h4>
+                    <p>您当前处于只读模式,仅可查看项目复盘数据,无法进行编辑操作</p>
+                  </div>
+                </div>
+              }
+              <!-- 上方 2x2 网格:前4个模块(只读模式下隐藏) -->
+              @if (!isReviewOnlyMode) {
               <div class="aftercare-grid">
                 
                 <!-- 1/4:尾款结算 -->
@@ -872,6 +895,7 @@
                   </div>
                 </div>
               </div>
+              }
               
               <!-- 下方横向展示:项目复盘模块 -->
               <div class="project-review-section">
@@ -1387,7 +1411,7 @@
               <div class="stage-progress-container">
                 @for (stage of getVisibleStages(); track stage) {
                   <div class="vertical-stage-block" [attr.id]="stageToAnchor(stage)" [class.active]="getStageStatus(stage) === 'active'">
-                    @if (stage !== '订单创建') {
+                    @if (stage !== '订单分配') {
                       <div class="vertical-stage-header">
                         <span class="dot" [class.completed]="getStageStatus(stage) === 'completed'" [class.active]="getStageStatus(stage) === 'active'"></span>
                         <h3>{{ stage === '需求沟通' ? '需求映射' : (stage === '方案确认' ? '色彩分析报告' : stage) }}</h3>
@@ -1395,8 +1419,8 @@
                     }
                     <!-- 直接复用原阶段内容卡片:按stage匹配显示 -->
                     <div class="vertical-stage-body">
-                      @if (stage === '订单创建') {
-                        <!-- 重构后的订单创建表单 - 组合order-creation-extra和consultation-order-panel -->
+                      @if (stage === '订单分配') {
+                        <!-- 重构后的订单分配表单 - 组合order-creation-extra和consultation-order-panel -->
                         <div class="order-creation-form-container">
                           <!-- 订单分配头部 -->
                           <div class="order-assignment-header">
@@ -1408,7 +1432,7 @@
                                 [disabled]="!canCreateOrder()"
                                 [class.disabled]="!canCreateOrder()"
                               >
-                                <span>创建订单</span>
+                                <span>分配订单</span>
                               </button>
                             </div>
                           </div>
@@ -2517,19 +2541,16 @@
         </div>
       </div>
     }
-  </div>
-}
 
-<!-- 上传成功弹窗 - 在根级别渲染以确保正确定位,避免被vertical-stage-block影响 -->
-@if (true) {
-  <app-upload-success-modal
-    [isVisible]="showUploadSuccessModal"
-    [uploadedFiles]="uploadedFiles"
-    [uploadType]="uploadType"
-    [analysisResult]="colorAnalysisResult || undefined"
-    [isAnalyzing]="isAnalyzingColors"
-    (closeModal)="onModalClose()"
-    (analyzeColors)="onAnalyzeColors()"
-    (viewReport)="onViewReport()">
-  </app-upload-success-modal>
+    <!-- 参考图管理标签页 -->
+    @if (isActiveTab('reference')) {
+      <div class="reference-tab-content">
+        <app-reference-image-manager 
+          [projectId]="projectId"
+          (imagesUpdated)="onReferenceImagesUpdated($event)">
+        </app-reference-image-manager>
+      </div>
+    }
+  </div>
 }
+ 

+ 71 - 201
src/app/pages/designer/project-detail/project-detail.scss

@@ -5238,221 +5238,91 @@
   }
 }
 
-// ==================== 需求映射面板样式 ====================
-.requirement-mapping-panel {
-  background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
+/* ==================== 只读复盘模式样式 ==================== */
+.review-only-notice {
+  display: flex;
+  align-items: center;
+  gap: 16px;
+  padding: 20px 24px;
+  margin-bottom: 24px;
+  background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
+  border-left: 4px solid #2196f3;
   border-radius: 12px;
-  padding: 20px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
-  max-height: calc(100vh - 200px);
-  overflow-y: auto;
-  position: sticky;
-  top: 20px;
-  
-  // 美化滚动条
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  
-  &::-webkit-scrollbar-thumb {
-    background: #888;
-    border-radius: 3px;
-    
-    &:hover {
-      background: #555;
-    }
-  }
-  
-  scrollbar-width: thin;
-  scrollbar-color: #888 #f1f1f1;
-  
-  .panel-title {
-    margin: 0 0 20px 0;
-    font-size: 22px;
-    font-weight: 700;
-    color: #495057;
-  }
-  
-  .mapping-progress {
-    margin-bottom: 20px;
-    
-    .progress-badge {
-      display: inline-block;
-      padding: 8px 16px;
-      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-      color: white;
-      border-radius: 16px;
-      font-size: 13px;
-      font-weight: 600;
-      box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
-      margin-bottom: 16px;
-      animation: badgePulse 2s ease-in-out infinite;
-    }
-    
-    .steps-list {
-      display: flex;
-      flex-direction: column;
-      gap: 8px;
-      
-      .step-item {
-        display: flex;
-        align-items: center;
-        gap: 8px;
-        padding: 8px 12px;
-        background: white;
-        border-radius: 6px;
-        border: 1px solid #e9ecef;
-        
-        &.completed {
-          border-color: #28a745;
-          background: #f0fdf4;
-        }
-        
-        &.in-progress {
-          border-color: #007bff;
-          background: #eff6ff;
-        }
-        
-        .step-icon {
-          font-size: 16px;
-        }
-        
-        .step-name {
-          font-size: 14px;
-          color: #495057;
-        }
-      }
-    }
+  box-shadow: 0 2px 12px rgba(33, 150, 243, 0.1);
+  animation: slideInDown 0.5s ease-out;
+
+  .notice-icon {
+    font-size: 32px;
+    animation: pulse 2s infinite;
   }
-  
-  .analysis-summary-panel,
-  .mapping-result-panel {
-    background: white;
-    border-radius: 8px;
-    padding: 16px;
-    margin-bottom: 16px;
-    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
-    
+
+  .notice-content {
+    flex: 1;
+
     h4 {
-      margin: 0 0 12px 0;
+      margin: 0 0 6px 0;
       font-size: 16px;
       font-weight: 600;
-      color: #333;
+      color: #1976d2;
     }
-    
-    .summary-grid {
-      display: flex;
-      flex-direction: column;
-      gap: 8px;
-      
-      .summary-item {
-        display: flex;
-        justify-content: space-between;
-        padding: 6px 0;
-        border-bottom: 1px solid #f0f0f0;
-        
-        &:last-child {
-          border-bottom: none;
-        }
-        
-        .label {
-          font-size: 13px;
-          color: #666;
-        }
-        
-        .value {
-          font-size: 13px;
-          font-weight: 600;
-          color: #333;
-        }
-      }
+
+    p {
+      margin: 0;
+      font-size: 14px;
+      color: #1565c0;
+      line-height: 1.5;
     }
   }
-  
-  .mapping-result-panel {
-    .param-section {
-      margin-bottom: 16px;
-      
-      &:last-child {
-        margin-bottom: 0;
-      }
-      
-      h5 {
-        margin: 0 0 8px 0;
-        font-size: 14px;
-        font-weight: 600;
-        color: #495057;
-        padding-bottom: 4px;
-        border-bottom: 2px solid #e9ecef;
-      }
-      
-      .param-items {
-        display: flex;
-        flex-direction: column;
-        gap: 6px;
-        
-        .param-row {
-          display: flex;
-          justify-content: space-between;
-          padding: 4px 0;
-          font-size: 13px;
-          
-          .label {
-            color: #666;
-          }
-          
-          .value {
-            font-weight: 600;
-            color: #333;
-          }
-        }
-      }
-    }
+}
+
+@keyframes slideInDown {
+  from {
+    opacity: 0;
+    transform: translateY(-20px);
   }
-  
-  .analyzing-indicator {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    gap: 12px;
-    padding: 16px;
-    background: white;
-    border-radius: 8px;
-    margin-top: 16px;
-    
-    .spinner {
-      width: 20px;
-      height: 20px;
-      border: 3px solid #f3f3f3;
-      border-top: 3px solid #667eea;
-      border-radius: 50%;
-      animation: spin 1s linear infinite;
-    }
-    
-    span {
-      font-size: 14px;
-      color: #666;
-    }
+  to {
+    opacity: 1;
+    transform: translateY(0);
   }
 }
 
-@keyframes badgePulse {
-  0%, 100% {
-    box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
-    transform: scale(1);
+/* ==================== 只读徽章样式 ==================== */
+.readonly-badge {
+  position: absolute;
+  top: -8px;
+  right: -8px;
+  background: linear-gradient(135deg, #ff9500 0%, #ff6b00 100%);
+  color: white;
+  font-size: 10px;
+  font-weight: 600;
+  padding: 3px 8px;
+  border-radius: 12px;
+  box-shadow: 0 2px 8px rgba(255, 149, 0, 0.3);
+  animation: pulse 2s infinite;
+}
+
+.stage-nav-item.readonly {
+  cursor: not-allowed;
+  opacity: 0.7;
+  
+  &:hover {
+    transform: none;
   }
-  50% {
-    box-shadow: 0 4px 16px rgba(102, 126, 234, 0.5);
-    transform: scale(1.02);
+  
+  .stage-nav-circle {
+    background: linear-gradient(135deg, #e0e0e0 0%, #bdbdbd 100%);
   }
 }
 
-@keyframes spin {
-  0% { transform: rotate(0deg); }
-  100% { transform: rotate(360deg); }
+/* ==================== 参考图管理标签页样式 ==================== */
+.reference-tab-content {
+  padding: 24px;
+  background: #f8f9fa;
+  min-height: calc(100vh - 300px);
+  
+  app-reference-image-manager {
+    display: block;
+    width: 100%;
+  }
 }
+

+ 103 - 62
src/app/pages/designer/project-detail/project-detail.ts

@@ -25,7 +25,8 @@ import { QuotationDetailsComponent, QuotationData } from './components/quotation
 import { DesignerAssignmentComponent, DesignerAssignmentData, Designer as AssignmentDesigner } from './components/designer-assignment/designer-assignment.component';
 // 引入客户服务模块的设计师日历组件
 import { DesignerCalendarComponent, Designer as CalendarDesigner, ProjectGroup as CalendarProjectGroup } from '../../customer-service/consultation-order/components/designer-calendar/designer-calendar.component';
-import { UploadSuccessModalComponent } from '../../../shared/components/upload-success-modal/upload-success-modal.component';
+// 引入参考图管理组件
+import { ReferenceImageManagerComponent } from './components/reference-image-manager/reference-image-manager.component';
 
 import { ColorAnalysisResult, ColorAnalysisService } from '../../../shared/services/color-analysis.service';
 
@@ -264,7 +265,7 @@ interface DeliveryProcess {
 @Component({
   selector: 'app-project-detail',
   standalone: true,
-  imports: [CommonModule, FormsModule, ReactiveFormsModule, RequirementsConfirmCardComponent, SettlementCardComponent, CustomerReviewCardComponent, CustomerReviewFormComponent, ComplaintCardComponent, PanoramicSynthesisCardComponent, QuotationDetailsComponent, DesignerAssignmentComponent, DesignerCalendarComponent, UploadSuccessModalComponent],
+  imports: [CommonModule, FormsModule, ReactiveFormsModule, RequirementsConfirmCardComponent, SettlementCardComponent, CustomerReviewCardComponent, CustomerReviewFormComponent, ComplaintCardComponent, PanoramicSynthesisCardComponent, QuotationDetailsComponent, DesignerAssignmentComponent, DesignerCalendarComponent, ReferenceImageManagerComponent],
   templateUrl: './project-detail.html',
   styleUrls: ['./project-detail.scss', './debug-styles.scss', './horizontal-panel.scss']
 })
@@ -287,6 +288,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
   showDropdown: boolean = false;
   currentStage: string = '';
   
+  // 新增:只读复盘模式(从财务工作台跳转)
+  isReviewOnlyMode: boolean = false;
+  
   // 新增:尾款结算完成状态
   isSettlementCompleted: boolean = false;
   isConfirmingSettlement: boolean = false;
@@ -302,7 +306,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 客户信息卡片展开/收起状态
   isCustomerInfoExpanded: boolean = false;
   
-  // 新增:订单创建表单相关
+  // 新增:订单分配表单相关
   orderCreationForm!: FormGroup;
   optionalForm!: FormGroup;
   isOptionalFormExpanded: boolean = false;
@@ -342,10 +346,10 @@ export class ProjectDetail implements OnInit, OnDestroy {
   isAnalyzingColors = false;
   
   // 新增:9阶段顺序(串式流程)- 包含后期阶段
-  stageOrder: ProjectStage[] = ['订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'];
+  stageOrder: ProjectStage[] = ['订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '后期', '尾款结算', '客户评价', '投诉处理'];
   // 新增:阶段展开状态(默认全部收起,当前阶段在数据加载后自动展开)
   expandedStages: Partial<Record<ProjectStage, boolean>> = {
-    '订单创建': false,
+    '订单分配': false,
     '需求沟通': false,
     '方案确认': false,
     '建模': false,
@@ -359,7 +363,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 
   // 新增:四大板块定义与展开状态 - 交付执行板块调整为三个阶段
   sections: Array<{ key: SectionKey; label: string; stages: ProjectStage[] }> = [
-    { key: 'order', label: '订单创建', stages: ['订单创建'] },
+    { key: 'order', label: '订单分配', stages: ['订单分配'] },
     { key: 'requirements', label: '确认需求', stages: ['需求沟通', '方案确认'] },
     { key: 'delivery', label: '交付执行', stages: ['建模', '软装', '渲染', '后期'] },
     { key: 'aftercare', label: '售后', stages: [] }
@@ -376,11 +380,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   showExceptionForm: boolean = false;
   
   // 标签页相关
-  activeTab: 'progress' | 'members' | 'files' = 'progress';
-  tabs: Array<{ id: 'progress' | 'members' | 'files'; name: string }> = [
+  activeTab: 'progress' | 'members' | 'files' | 'reference' = 'progress';
+  tabs: Array<{ id: 'progress' | 'members' | 'files' | 'reference'; name: string }> = [
     { id: 'progress', name: '项目进度' },
     { id: 'members', name: '项目成员' },
-    { id: 'files', name: '项目文件' }
+    { id: 'files', name: '项目文件' },
+    { id: 'reference', name: '参考图管理' }
   ];
 
   // 标准化阶段(视图层映射)
@@ -507,12 +512,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   ) {}
 
   // 切换标签页
-  switchTab(tabId: 'progress' | 'members' | 'files') {
+  switchTab(tabId: 'progress' | 'members' | 'files' | 'reference') {
     this.activeTab = tabId;
   }
 
   // 类型安全的标签页检查方法
-  isActiveTab(tabId: 'progress' | 'members' | 'files'): boolean {
+  isActiveTab(tabId: 'progress' | 'members' | 'files' | 'reference'): boolean {
     return this.activeTab === tabId;
   }
 
@@ -544,26 +549,26 @@ export class ProjectDetail implements OnInit, OnDestroy {
     this.router.navigate([], { relativeTo: this.route, queryParamsHandling: 'merge', queryParams: { id: projectId } });
   }
 
-  // 检查是否处于订单创建阶段,用于红色高亮显示
+  // 检查是否处于订单分配阶段,用于红色高亮显示
   isCurrentOrderCreation(): boolean {
-    // 只有当订单创建阶段是当前活跃阶段时才标红显示
+    // 只有当订单分配阶段是当前活跃阶段时才标红显示
     // 修复逻辑:完成前序环节后才标红当前阶段
     const currentStage = this.project?.currentStage;
     if (!currentStage) return false;
     
-    // 如果当前阶段就是订单创建阶段,说明需要标红显示
-    if (currentStage === '订单创建') return true;
+    // 如果当前阶段就是订单分配阶段,说明需要标红显示
+    if (currentStage === '订单分配') return true;
     
-    // 如果当前阶段在订单创建之后,说明订单创建已完成,不应标红
+    // 如果当前阶段在订单分配之后,说明订单分配已完成,不应标红
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
     const currentIndex = stageOrder.indexOf(currentStage);
-    const orderCreationIndex = stageOrder.indexOf('订单创建');
+    const orderCreationIndex = stageOrder.indexOf('订单分配');
     
-    // 如果当前阶段在订单创建之后,说明订单创建已完成
+    // 如果当前阶段在订单分配之后,说明订单分配已完成
     return currentIndex <= orderCreationIndex;
   }
 
@@ -578,7 +583,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     
     // 定义阶段顺序
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
@@ -623,6 +628,26 @@ export class ProjectDetail implements OnInit, OnDestroy {
   }
 
   ngOnInit(): void {
+    // 检查是否为只读复盘模式(从财务工作台跳转)
+    this.route.queryParams.subscribe(params => {
+      if (params['view'] === 'review-only') {
+        this.isReviewOnlyMode = true;
+      }
+      
+      // 检查是否需要直接定位到售后板块
+      if (params['section'] === 'aftercare' || params['view'] === 'review-only') {
+        // 自动切换到售后板块
+        this.expandedSection = 'aftercare';
+        // 滚动到项目复盘区域
+        setTimeout(() => {
+          const reviewSection = document.querySelector('.project-review-section');
+          if (reviewSection) {
+            reviewSection.scrollIntoView({ behavior: 'smooth', block: 'start' });
+          }
+        }, 500);
+      }
+    });
+
     // 初始化表单
     this.initializeForms();
     
@@ -658,12 +683,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
     this.route.queryParamMap.subscribe({
       next: (qp) => {
       const raw = qp.get('activeTab');
-      const alias: Record<string, 'progress' | 'members' | 'files'> = {
+      const alias: Record<string, 'progress' | 'members' | 'files' | 'reference'> = {
         requirements: 'progress',
         overview: 'progress'
       };
       const tab = raw && (raw in alias ? alias[raw] : raw);
-      if (tab === 'progress' || tab === 'members' || tab === 'files') {
+      if (tab === 'progress' || tab === 'members' || tab === 'files' || tab === 'reference') {
         this.activeTab = tab;
       }
       
@@ -697,7 +722,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
           // 设置同步状态
           this.isSyncingCustomerInfo = true;
           
-          // 存储订单创建数据用于显示
+          // 存储订单分配数据用于显示
           this.orderCreationData = syncData;
           
           // 更新projectData以传递给子组件
@@ -864,7 +889,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 只读规则:客服视角为只读
   isReadOnly(): boolean { return this.isCustomerServiceView(); }
 
-  // 权限控制:客服只能编辑订单创建、确认需求、售后板块
+  // 权限控制:客服只能编辑订单分配、确认需求、售后板块
   canEditSection(sectionKey: SectionKey): boolean {
     if (this.isCustomerServiceView()) {
       return sectionKey === 'order' || sectionKey === 'requirements' || sectionKey === 'aftercare';
@@ -876,7 +901,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   canEditStage(stage: ProjectStage): boolean {
     if (this.isCustomerServiceView()) {
       const editableStages: ProjectStage[] = [
-        '订单创建', '需求沟通', '方案确认', // 订单创建和确认需求板块
+        '订单分配', '需求沟通', '方案确认', // 订单分配和确认需求板块
         '尾款结算', '客户评价', '投诉处理' // 售后板块
       ];
       return editableStages.includes(stage);
@@ -892,7 +917,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   }
 
   // 返回当前板块的全部阶段(所有角色一致):
-  // 设计师也可查看 订单创建/确认需求/售后 板块内容
+  // 设计师也可查看 订单分配/确认需求/售后 板块内容
   getVisibleStages(): ProjectStage[] {
     const activeKey = this.getActiveSectionKey();
     const sec = this.sections.find(s => s.key === activeKey);
@@ -1414,7 +1439,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 将现有细分阶段映射为标准化阶段
   mapToStandardPhase(stage: ProjectStage): '待分配' | '需求方案' | '项目执行' | '收尾验收' | '归档' {
     const mapping: Record<ProjectStage, '待分配' | '需求方案' | '项目执行' | '收尾验收' | '归档'> = {
-      '订单创建': '待分配',
+      '订单分配': '待分配',
       '需求沟通': '需求方案',
       '方案确认': '需求方案',
       '建模': '项目执行',
@@ -2121,7 +2146,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 根据阶段映射所属板块
   getSectionKeyForStage(stage: ProjectStage): SectionKey {
     switch (stage) {
-      case '订单创建':
+      case '订单分配':
         return 'order';
       case '需求沟通':
       case '方案确认':
@@ -2145,8 +2170,8 @@ export class ProjectDetail implements OnInit, OnDestroy {
     // 优先使用本地的currentStage,如果没有则使用project.currentStage
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    // 如果没有当前阶段(新创建的项目),默认订单创建板块为active(红色)
-    if (!current || current === '订单创建') {
+    // 如果没有当前阶段(新创建的项目),默认订单分配板块为active(红色)
+    if (!current || current === '订单分配') {
       return key === 'order' ? 'active' : 'pending';
     }
 
@@ -2185,7 +2210,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   // 阶段到锚点的映射
   stageToAnchor(stage: ProjectStage): string {
     const map: Record<ProjectStage, string> = {
-      '订单创建': 'order',
+      '订单分配': 'order',
       '需求沟通': 'requirements-talk',
       '方案确认': 'proposal-confirm',
       '建模': 'modeling',
@@ -2208,7 +2233,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     }
   }
 
-  // 订单创建阶段:客户信息(迁移自客服端"客户信息"卡片)
+  // 订单分配阶段:客户信息(迁移自客服端"客户信息"卡片)
   orderCreationMethod: 'miniprogram' | 'manual' = 'miniprogram';
   isSyncing: boolean = false;
   orderTime: string = '';
@@ -2390,6 +2415,13 @@ export class ProjectDetail implements OnInit, OnDestroy {
     console.log('预览文件:', file.name);
   }
 
+  // 处理参考图更新事件
+  onReferenceImagesUpdated(images: any[]): void {
+    console.log('参考图已更新:', images);
+    // 这里可以实现保存到后端的逻辑
+    // 也可以触发项目状态的更新
+  }
+
   // 同步需求关键信息到客户信息卡片
   syncRequirementKeyInfo(requirementData: any): void {
     if (requirementData) {
@@ -2557,7 +2589,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     }
     
     const stageOrder = [
-      '订单创建', '需求沟通', '方案确认', '建模', '软装', 
+      '订单分配', '需求沟通', '方案确认', '建模', '软装', 
       '渲染', '尾款结算', '客户评价', '投诉处理'
     ];
     
@@ -2649,12 +2681,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   getProjectStatusText(): string {
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    if (!current || current === '订单创建') {
+    if (!current || current === '订单分配') {
       return '待开始';
     }
     
     // 检查是否已完成所有阶段
-    const allStages: ProjectStage[] = ['订单创建', '需求沟通', '方案确认', '建模', '软装', '渲染', '尾款结算', '客户评价', '投诉处理'];
+    const allStages: ProjectStage[] = ['订单分配', '需求沟通', '方案确认', '建模', '软装', '渲染', '尾款结算', '客户评价', '投诉处理'];
     const currentIndex = allStages.indexOf(current);
     
     if (currentIndex === allStages.length - 1) {
@@ -2668,8 +2700,8 @@ export class ProjectDetail implements OnInit, OnDestroy {
   getCurrentStageText(): string {
     const current = (this.currentStage || this.project?.currentStage) as ProjectStage | undefined;
     
-    if (!current || current === '订单创建') {
-      return '订单创建阶段';
+    if (!current || current === '订单分配') {
+      return '订单分配阶段';
     }
     
     return `${current}阶段`;
@@ -2685,7 +2717,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
     
     // 定义所有阶段及其权重
     const stageWeights: Record<ProjectStage, number> = {
-      '订单创建': 5,
+      '订单分配': 5,
       '需求沟通': 15,
       '方案确认': 25,
       '建模': 40,
@@ -2841,12 +2873,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
   }
 
   // 处理咨询订单表单提交
-  // 存储订单创建时的客户信息和需求信息
+  // 存储订单分配时的客户信息和需求信息
 
   onConsultationOrderSubmit(formData: any): void {
     console.log('咨询订单表单提交:', formData);
     
-    // 保存订单创建数据
+    // 保存订单分配数据
     this.orderCreationData = formData;
     
     // 更新projectData以便传递给子组件(集成报价与指派信息)
@@ -2968,7 +3000,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
       // 进入下一个阶段:需求沟通
       this.updateProjectStage('需求沟通');
       this.expandedStages['需求沟通'] = true;
-      this.expandedStages['订单创建'] = false;
+      this.expandedStages['订单分配'] = false;
       
       // 显示成功消息
       alert('团队分配成功!已进入需求沟通阶段');
@@ -2990,9 +3022,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
       this.project.currentStage = '需求沟通';
     }
     
-    // 展开需求沟通阶段,收起订单创建阶段
+    // 展开需求沟通阶段,收起订单分配阶段
     this.expandedStages['需求沟通'] = true;
-    this.expandedStages['订单创建'] = false;
+    this.expandedStages['订单分配'] = false;
     
     // 自动展开确认需求板块
     this.expandedSection = 'requirements';
@@ -3721,7 +3753,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   };
   
   sopStagesData: any[] = [
-    { name: '订单创建', plannedDuration: 1, actualDuration: 1, score: 95, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
+    { name: '订单分配', plannedDuration: 1, actualDuration: 1, score: 95, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
     { name: '需求沟通', plannedDuration: 3, actualDuration: 4, score: 75, status: 'completed', statusText: '已完成', isDelayed: true, issues: ['沟通次数超标'] },
     { name: '方案确认', plannedDuration: 2, actualDuration: 2, score: 90, status: 'completed', statusText: '已完成', isDelayed: false, issues: [] },
     { name: '建模', plannedDuration: 4, actualDuration: 5, score: 80, status: 'completed', statusText: '已完成', isDelayed: true, issues: ['细节调整耗时'] },
@@ -4092,6 +4124,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
   startPanoramicSynthesis(): void {
     console.log('🎨 启动全景图合成...');
     
+    // 显示提示信息
+    alert('📸 请选择需要合成全景图的图片\n\n提示:\n1. 建议选择同一空间的多个角度照片\n2. 图片文件名可以包含空间名称(如:客厅-角度1.jpg)\n3. 系统会自动识别并分类');
+    
     // 打开文件选择对话框,支持多文件选择
     const fileInput = document.createElement('input');
     fileInput.type = 'file';
@@ -4240,19 +4275,19 @@ export class ProjectDetail implements OnInit, OnDestroy {
 
   // 查看全景图画廊
   viewPanoramicGallery(): void {
-    console.log('打开全景图画廊');
+    console.log('📁 打开全景图画廊');
     
     if (this.panoramicSyntheses.length === 0) {
-      alert('暂无全景图记录');
+      alert('📁 全景图画廊\n\n暂无全景图记录,请先进行全景图合成。');
       return;
     }
     
-    // 显示全景图列表
-    const galleryInfo = this.panoramicSyntheses.map((s, i) => 
-      `${i + 1}. ${s.projectName} - ${s.status === 'completed' ? '已完成' : '处理中'} (${s.spaces.length}个空间)`
+    // 显示全景图列表提示
+    const galleryInfo = this.panoramicSyntheses.map((item, index) => 
+      `${index + 1}. ${item.projectName} - ${item.status === 'completed' ? '✅ 已完成' : '⏳ 处理中'} (${item.spaces?.length || 0}个空间)`
     ).join('\n');
     
-    alert(`全景图画廊\n\n${galleryInfo}\n\n点击查看详情功能开发中...`);
+    alert(`📁 全景图画廊(共${this.panoramicSyntheses.length}个)\n\n${galleryInfo}\n\n提示:点击列表中的全景图可查看详情或下载`);
   }
   
   // 复制全景图链接
@@ -4368,6 +4403,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
   createComplaintManually(): void {
     console.log('📝 手动创建投诉');
     
+    // 显示创建投诉表单提示
+    alert('📝 创建投诉记录\n\n即将打开投诉创建表单,请填写以下信息:\n• 投诉环节\n• 核心问题\n• 客户反馈\n• 严重程度');
+    
     // 弹出创建投诉表单
     const complaintReason = prompt('请输入投诉原因:');
     if (!complaintReason || complaintReason.trim() === '') return;
@@ -4452,21 +4490,24 @@ export class ProjectDetail implements OnInit, OnDestroy {
     console.log('⚙️ 设置关键词监控');
     
     if (this.isKeywordMonitoringActive) {
-      const confirmStop = confirm('关键词监控已激活,是否停止监控?');
+      const confirmStop = confirm('⚙️ 关键词监控管理\n\n状态:✅ 已激活\n监控关键词:' + this.complaintKeywords.join('、') + '\n\n是否停止监控?');
       if (confirmStop) {
         this.isKeywordMonitoringActive = false;
-        alert('✅ 关键词监控已停止');
+        alert('⏸️ 关键词监控已停止\n\n系统将不再自动抓取企业微信群中的投诉关键词');
       }
       return;
     }
     
-    // 显示当前监控关键词
+    // 显示设置说明和当前关键词
+    alert('⚙️ 关键词监控功能\n\n功能说明:\n• 自动监测企业微信群消息\n• 识别投诉相关关键词\n• 自动创建投诉记录并标注\n• 实时通知相关处理人员\n\n当前监控关键词:\n' + this.complaintKeywords.join('、'));
+    
     const currentKeywords = this.complaintKeywords.join('、');
-    const newKeywords = prompt(`当前监控关键词:\n\n${currentKeywords}\n\n请输入要添加的关键词(多个关键词用逗号分隔):`);
+    const newKeywords = prompt(`当前监控关键词:\n${currentKeywords}\n\n请输入要添加的关键词(多个关键词用逗号分隔):`);
     
     if (newKeywords && newKeywords.trim()) {
       const keywords = newKeywords.split(/[,,、]/).map(k => k.trim()).filter(k => k);
       this.complaintKeywords = [...new Set([...this.complaintKeywords, ...keywords])];
+      alert(`✅ 关键词已更新\n\n新增关键词:${keywords.join('、')}\n\n全部监控关键词:\n${this.complaintKeywords.join('、')}`);
     }
     
     // 激活监控
@@ -4688,7 +4729,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
   
   // 初始化表单
   initializeForms(): void {
-    // 初始化订单创建表单(必填项)
+    // 初始化订单分配表单(必填项)
     this.orderCreationForm = this.fb.group({
       orderAmount: ['', [Validators.required, Validators.min(0)]],
       smallImageDeliveryTime: ['', Validators.required],
@@ -4708,12 +4749,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
     });
   }
 
-  // 检查是否可以创建订单
+  // 检查是否可以分配订单
   canCreateOrder(): boolean {
     return this.orderCreationForm ? this.orderCreationForm.valid : false;
   }
 
-  // 创建订单
+  // 分配订单
   createOrder(): void {
     if (!this.canCreateOrder()) {
       // 标记所有字段为已触摸,以显示验证错误
@@ -4729,14 +4770,14 @@ export class ProjectDetail implements OnInit, OnDestroy {
       designerAssignment: this.designerAssignmentData
     };
 
-    console.log('创建订单:', orderData);
+    console.log('分配订单:', orderData);
     
-    // 这里应该调用API创建订单
+    // 这里应该调用API分配订单
     // 模拟API调用
     setTimeout(() => {
-      alert('订单创建成功!');
-      // 订单创建成功后自动切换到下一环节
-      this.advanceToNextStage('订单创建');
+      alert('订单分配成功!');
+      // 订单分配成功后自动切换到下一环节
+      this.advanceToNextStage('订单分配');
     }, 500);
   }
   

+ 8 - 10
src/app/pages/designer/project-detail/project-review-styles.scss

@@ -617,27 +617,25 @@
                   .stage-score {
                     font-weight: 700;
                     font-size: 16px;
-                    padding: 4px 12px;
-                    border-radius: 6px;
+                    padding: 6px 14px;
+                    border-radius: 8px;
+                    color: white !important; // 强制白色文字确保可读性
+                    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); // 添加文字阴影增强可读性
                     
                     &.excellent { 
-                      color: white;
-                      background: #34c759;
+                      background: linear-gradient(135deg, #34c759 0%, #28a745 100%);
                       box-shadow: 0 2px 8px rgba(52, 199, 89, 0.3);
                     }
                     &.good { 
-                      color: white;
-                      background: #007aff;
+                      background: linear-gradient(135deg, #007aff 0%, #0051d5 100%);
                       box-shadow: 0 2px 8px rgba(0, 122, 255, 0.3);
                     }
                     &.fair { 
-                      color: white;
-                      background: #ff9500;
+                      background: linear-gradient(135deg, #ff9500 0%, #e68600 100%);
                       box-shadow: 0 2px 8px rgba(255, 149, 0, 0.3);
                     }
                     &.poor { 
-                      color: white;
-                      background: #ff3b30;
+                      background: linear-gradient(135deg, #ff3b30 0%, #d32f2f 100%);
                       box-shadow: 0 2px 8px rgba(255, 59, 48, 0.3);
                     }
                   }

+ 228 - 7
src/app/pages/finance/dashboard/dashboard.html

@@ -7,23 +7,23 @@
 
   <!-- 快捷操作区域 -->
   <div class="quick-actions">
-    <button class="action-btn" (click)="handleQuickAction('newQuote')">
+    <button class="action-btn" [class.active]="activeNavItem() === 'newQuote'" (click)="handleQuickAction('newQuote')">
       <div class="action-icon new-quote">📝</div>
       <div class="action-label">新建报价</div>
     </button>
-    <button class="action-btn" (click)="handleQuickAction('recordPayment')">
+    <button class="action-btn" [class.active]="activeNavItem() === 'recordPayment'" (click)="handleQuickAction('recordPayment')">
       <div class="action-icon record-payment">💰</div>
       <div class="action-label">录入收款</div>
     </button>
-    <button class="action-btn" (click)="handleQuickAction('generateReport')">
+    <button class="action-btn" [class.active]="activeNavItem() === 'generateReport'" (click)="handleQuickAction('generateReport')">
       <div class="action-icon generate-report">📊</div>
       <div class="action-label">生成日接单表</div>
     </button>
-    <button class="action-btn" (click)="handleQuickAction('quotationApproval')">
+    <button class="action-btn" [class.active]="activeNavItem() === 'quotationApproval'" (click)="handleQuickAction('quotationApproval')">
       <div class="action-icon quotation-approval">✅</div>
       <div class="action-label">报价审核</div>
     </button>
-    <button class="action-btn work-hour-btn" (click)="toggleWorkHourModule()">
+    <button class="action-btn work-hour-btn" [class.active]="showWorkHourModule()" (click)="toggleWorkHourModule(); activeNavItem.set('workHour')">
       <div class="action-icon work-hour">⏱️</div>
       <div class="action-label">工时统计</div>
     </button>
@@ -38,6 +38,28 @@
         <button class="close-btn" (click)="toggleWorkHourModule()">×</button>
       </div>
       
+      <!-- 时间维度筛选 -->
+      <div class="time-dimension-filter">
+        <button 
+          class="dimension-btn" 
+          [class.active]="timeDimension() === 'week'"
+          (click)="setTimeDimension('week')">
+          本周
+        </button>
+        <button 
+          class="dimension-btn" 
+          [class.active]="timeDimension() === 'month'"
+          (click)="setTimeDimension('month')">
+          本月
+        </button>
+        <button 
+          class="dimension-btn" 
+          [class.active]="timeDimension() === 'quarter'"
+          (click)="setTimeDimension('quarter')">
+          本季度
+        </button>
+      </div>
+
       <!-- 工时概览卡片 -->
       <div class="work-hour-overview" *ngIf="workHourDashboard()">
         <div class="overview-card">
@@ -63,11 +85,198 @@
             <div class="card-label">平均有效工时</div>
           </div>
         </div>
+        
+        <div class="overview-card warning-card">
+          <div class="card-icon">⚠️</div>
+          <div class="card-content">
+            <div class="card-value">{{ overdueProjects().length }}</div>
+            <div class="card-label">逾期项目数</div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 标准工时设置 -->
+      <div class="standard-hours-section">
+        <h3>📊 标准工时预设</h3>
+        <div class="complexity-cards">
+          <div class="complexity-card" *ngFor="let complexity of projectComplexities">
+            <div class="complexity-header">
+              <span class="complexity-type">{{ complexity.type }}</span>
+            </div>
+            <div class="complexity-stages">
+              <div class="stage-item">
+                <span class="stage-name">需求深化</span>
+                <span class="stage-hours">{{ complexity.standardHours.requirementDeepening }}h</span>
+              </div>
+              <div class="stage-item">
+                <span class="stage-name">建模</span>
+                <span class="stage-hours">{{ complexity.standardHours.modeling }}h</span>
+              </div>
+              <div class="stage-item">
+                <span class="stage-name">渲染</span>
+                <span class="stage-hours">{{ complexity.standardHours.rendering }}h</span>
+              </div>
+              <div class="stage-item">
+                <span class="stage-name">后期</span>
+                <span class="stage-hours">{{ complexity.standardHours.postProduction }}h</span>
+              </div>
+            </div>
+            <div class="complexity-total">
+              总计: {{ complexity.standardHours.requirementDeepening + complexity.standardHours.modeling + complexity.standardHours.rendering + complexity.standardHours.postProduction }}h
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 逾期项目管理 -->
+      <div class="overdue-section">
+        <div class="section-title">
+          <h3>⚠️ 逾期项目监控</h3>
+          <button class="export-btn" (click)="exportOverdueReport()">
+            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
+              <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
+              <polyline points="7 10 12 15 17 10"></polyline>
+              <line x1="12" y1="15" x2="12" y2="3"></line>
+            </svg>
+            导出报表
+          </button>
+        </div>
+        
+        <div class="overdue-list">
+          <div 
+            class="overdue-item" 
+            *ngFor="let project of overdueProjects()"
+            [class]="getOverdueClass(project.overdueDays)"
+            (click)="viewProjectDetail(project.id)">
+            <div class="overdue-header">
+              <div class="project-info">
+                <span class="project-name">{{ project.name }}</span>
+                <span class="project-id">ID: {{ project.id }}</span>
+              </div>
+              <div class="overdue-badge" [class]="getOverdueClass(project.overdueDays)">
+                逾期 {{ project.overdueDays }} 天
+              </div>
+            </div>
+            <div class="overdue-content">
+              <div class="overdue-detail">
+                <span class="detail-label">阶段:</span>
+                <span class="detail-value stage-badge">{{ project.stage }}</span>
+              </div>
+              <div class="overdue-detail">
+                <span class="detail-label">设计师:</span>
+                <span class="detail-value">{{ project.designerName }}</span>
+              </div>
+              <div class="overdue-detail">
+                <span class="detail-label">原因:</span>
+                <span class="detail-value reason">{{ project.reason }}</span>
+              </div>
+            </div>
+            <div class="overdue-action">
+              <span class="view-detail-text">查看详情 →</span>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 人效统计看板 -->
+      <div class="efficiency-dashboard">
+        <h3>📈 人效统计看板 - {{ getTimeDimensionText() }}</h3>
+        
+        <div class="efficiency-list">
+          <div 
+            class="efficiency-item" 
+            *ngFor="let designer of designerEfficiencies()"
+            (click)="viewDesignerDetail(designer.id)">
+            
+            <!-- 设计师基本信息 -->
+            <div class="efficiency-header">
+              <div class="designer-info">
+                <div class="designer-name">{{ designer.name }}</div>
+                <div class="designer-stats-summary">
+                  <span class="stat-chip" [style.background-color]="getEfficiencyLevelColor(designer.avgCompletionTime)">
+                    平均 {{ designer.avgCompletionTime }} 天
+                  </span>
+                  <span class="stat-chip overdue" *ngIf="designer.overdueProjectCount > 0">
+                    逾期 {{ designer.overdueProjectCount }} 个
+                  </span>
+                  <span class="stat-chip idle" *ngIf="designer.idleDays > 0">
+                    闲置 {{ designer.idleDays }} 天
+                  </span>
+                </div>
+              </div>
+            </div>
+
+            <!-- 各阶段工时利用率 -->
+            <div class="stage-utilization">
+              <div class="utilization-item">
+                <div class="utilization-header">
+                  <span class="stage-label">需求深化</span>
+                  <span class="utilization-value">{{ designer.stageUtilization.requirementDeepening }}%</span>
+                </div>
+                <div class="utilization-bar">
+                  <div 
+                    class="utilization-fill" 
+                    [style.width.%]="designer.stageUtilization.requirementDeepening"
+                    [style.background-color]="getUtilizationColor(designer.stageUtilization.requirementDeepening)">
+                  </div>
+                </div>
+              </div>
+
+              <div class="utilization-item">
+                <div class="utilization-header">
+                  <span class="stage-label">建模</span>
+                  <span class="utilization-value">{{ designer.stageUtilization.modeling }}%</span>
+                </div>
+                <div class="utilization-bar">
+                  <div 
+                    class="utilization-fill" 
+                    [style.width.%]="designer.stageUtilization.modeling"
+                    [style.background-color]="getUtilizationColor(designer.stageUtilization.modeling)">
+                  </div>
+                </div>
+              </div>
+
+              <div class="utilization-item">
+                <div class="utilization-header">
+                  <span class="stage-label">渲染</span>
+                  <span class="utilization-value">{{ designer.stageUtilization.rendering }}%</span>
+                </div>
+                <div class="utilization-bar">
+                  <div 
+                    class="utilization-fill" 
+                    [style.width.%]="designer.stageUtilization.rendering"
+                    [style.background-color]="getUtilizationColor(designer.stageUtilization.rendering)">
+                  </div>
+                </div>
+              </div>
+
+              <div class="utilization-item">
+                <div class="utilization-header">
+                  <span class="stage-label">后期</span>
+                  <span class="utilization-value">{{ designer.stageUtilization.postProduction }}%</span>
+                </div>
+                <div class="utilization-bar">
+                  <div 
+                    class="utilization-fill" 
+                    [style.width.%]="designer.stageUtilization.postProduction"
+                    [style.background-color]="getUtilizationColor(designer.stageUtilization.postProduction)">
+                  </div>
+                </div>
+              </div>
+            </div>
+
+            <!-- 决策建议 -->
+            <div class="efficiency-suggestion">
+              <div class="suggestion-icon">💡</div>
+              <div class="suggestion-text">{{ designer.suggestion }}</div>
+            </div>
+          </div>
+        </div>
       </div>
 
       <!-- 绩效等级分布 -->
       <div class="performance-distribution" *ngIf="workHourDashboard()">
-        <h3>绩效等级分布</h3>
+        <h3>🏆 绩效等级分布</h3>
         <div class="performance-chart">
           <div class="performance-item" *ngFor="let level of ['S', 'A', 'B', 'C']">
             <div class="level-indicator" [style.background-color]="getPerformanceLevelColor(level)">
@@ -83,7 +292,7 @@
 
       <!-- 月度统计表格 -->
       <div class="monthly-stats" *ngIf="monthlyStats().length > 0">
-        <h3>设计师月度统计</h3>
+        <h3>📅 设计师月度统计</h3>
         <div class="stats-table">
           <div class="table-header">
             <div class="header-cell">设计师</div>
@@ -174,4 +383,16 @@
       </div>
     </div>
   </div>
+
+  <!-- 精美悬浮按钮 - 跳转到项目复盘 -->
+  <button class="floating-review-btn" (click)="goToAftercare()" *ngIf="showFloatingButton()" title="查看项目复盘">
+    <div class="floating-btn-icon">
+      <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
+        <path d="M9 11l3 3L22 4"></path>
+        <path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"></path>
+      </svg>
+    </div>
+    <span class="floating-btn-text">项目复盘</span>
+    <div class="floating-btn-pulse"></div>
+  </button>
 </div>

+ 711 - 2
src/app/pages/finance/dashboard/dashboard.scss

@@ -36,6 +36,7 @@
 }
 
 .action-btn {
+  position: relative;
   display: flex;
   flex-direction: column;
   align-items: center;
@@ -46,12 +47,61 @@
   border: none;
   box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
   cursor: pointer;
-  transition: all 0.3s ease;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  overflow: hidden;
+
+  // 点击涟漪效果
+  &::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 0;
+    height: 0;
+    border-radius: 50%;
+    background: rgba(59, 130, 246, 0.2);
+    transform: translate(-50%, -50%);
+    transition: width 0.6s ease-out, height 0.6s ease-out, opacity 0.3s ease-out;
+    opacity: 0;
+  }
+
+  &:active::before {
+    width: 300px;
+    height: 300px;
+    opacity: 1;
+  }
+
+  // 点击缩放效果
+  &:active {
+    transform: scale(0.96);
+  }
 }
 
 .action-btn:hover {
   transform: translateY(-2px);
   box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+  
+  &:active {
+    transform: translateY(-1px) scale(0.96);
+  }
+}
+
+.action-btn.active {
+  background: linear-gradient(135deg, #007aff 0%, #0056b3 100%);
+  color: white;
+  box-shadow: 0 4px 20px rgba(0, 122, 255, 0.3);
+  
+  &::before {
+    background: rgba(255, 255, 255, 0.2);
+  }
+}
+
+.action-btn.active .action-icon {
+  color: white;
+}
+
+.action-btn.active .action-label {
+  color: white;
 }
 
 .action-icon {
@@ -142,6 +192,7 @@
 }
 
 .view-detail-btn {
+  position: relative;
   padding: 8px 16px;
   background-color: #f2f2f7;
   border: none;
@@ -150,11 +201,36 @@
   font-weight: 500;
   color: #007aff;
   cursor: pointer;
-  transition: all 0.3s ease;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  overflow: hidden;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 0;
+    height: 0;
+    border-radius: 50%;
+    background: rgba(0, 122, 255, 0.15);
+    transform: translate(-50%, -50%);
+    transition: width 0.5s ease-out, height 0.5s ease-out;
+  }
+
+  &:active::before {
+    width: 200px;
+    height: 200px;
+  }
+
+  &:active {
+    transform: scale(0.95);
+  }
 }
 
 .view-detail-btn:hover {
   background-color: #e5e5ea;
+  transform: translateY(-1px);
+  box-shadow: 0 2px 8px rgba(0, 122, 255, 0.15);
 }
 
 /* 待办任务区域 */
@@ -548,4 +624,637 @@
     opacity: 1;
     transform: translateY(0);
   }
+}
+
+/* 时间维度筛选器 */
+.time-dimension-filter {
+  display: flex;
+  gap: 8px;
+  margin-bottom: 20px;
+  padding: 4px;
+  background-color: #f2f2f7;
+  border-radius: 10px;
+  width: fit-content;
+}
+
+.dimension-btn {
+  position: relative;
+  padding: 8px 20px;
+  background-color: transparent;
+  border: none;
+  border-radius: 8px;
+  font-size: 14px;
+  font-weight: 500;
+  color: #8e8e93;
+  cursor: pointer;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  overflow: hidden;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 0;
+    height: 0;
+    border-radius: 50%;
+    background: rgba(0, 122, 255, 0.1);
+    transform: translate(-50%, -50%);
+    transition: width 0.4s ease-out, height 0.4s ease-out;
+  }
+
+  &:active::before {
+    width: 150px;
+    height: 150px;
+  }
+
+  &:active {
+    transform: scale(0.93);
+  }
+}
+
+.dimension-btn.active {
+  background-color: #ffffff;
+  color: #007aff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+  
+  &::before {
+    background: rgba(0, 122, 255, 0.08);
+  }
+}
+
+.dimension-btn:hover:not(.active) {
+  color: #1c1c1e;
+  background-color: rgba(0, 0, 0, 0.03);
+}
+
+/* 标准工时预设 */
+.standard-hours-section {
+  margin-bottom: 32px;
+}
+
+.standard-hours-section h3 {
+  font-size: 18px;
+  font-weight: 600;
+  color: #1c1c1e;
+  margin-bottom: 16px;
+}
+
+.complexity-cards {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+  gap: 16px;
+}
+
+.complexity-card {
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  border-radius: 16px;
+  padding: 20px;
+  color: white;
+  box-shadow: 0 4px 16px rgba(102, 126, 234, 0.2);
+  transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.complexity-card:hover {
+  transform: translateY(-4px);
+  box-shadow: 0 6px 24px rgba(102, 126, 234, 0.3);
+}
+
+.complexity-header {
+  margin-bottom: 16px;
+}
+
+.complexity-type {
+  font-size: 16px;
+  font-weight: 600;
+  display: block;
+}
+
+.complexity-stages {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  margin-bottom: 16px;
+}
+
+.stage-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 8px 12px;
+  background-color: rgba(255, 255, 255, 0.15);
+  border-radius: 8px;
+  backdrop-filter: blur(10px);
+}
+
+.stage-name {
+  font-size: 13px;
+  font-weight: 500;
+}
+
+.stage-hours {
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.complexity-total {
+  font-size: 14px;
+  font-weight: 600;
+  text-align: center;
+  padding: 8px;
+  background-color: rgba(255, 255, 255, 0.2);
+  border-radius: 8px;
+}
+
+/* 逾期项目监控 */
+.overdue-section {
+  margin-bottom: 32px;
+}
+
+.overdue-section .section-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 16px;
+}
+
+.overdue-section h3 {
+  font-size: 18px;
+  font-weight: 600;
+  color: #1c1c1e;
+  margin: 0;
+}
+
+.export-btn {
+  position: relative;
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  padding: 8px 16px;
+  background-color: #007aff;
+  color: white;
+  border: none;
+  border-radius: 10px;
+  font-size: 14px;
+  font-weight: 500;
+  cursor: pointer;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  overflow: hidden;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 0;
+    height: 0;
+    border-radius: 50%;
+    background: rgba(255, 255, 255, 0.3);
+    transform: translate(-50%, -50%);
+    transition: width 0.5s ease-out, height 0.5s ease-out;
+  }
+
+  &:active::before {
+    width: 200px;
+    height: 200px;
+  }
+
+  &:active {
+    transform: scale(0.95);
+    background-color: #0056b3;
+  }
+}
+
+.export-btn:hover {
+  background-color: #0056b3;
+  box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3);
+  transform: translateY(-1px);
+}
+
+.overdue-list {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+
+.overdue-item {
+  background-color: #ffffff;
+  border-radius: 16px;
+  padding: 20px;
+  border-left: 4px solid #ff9500;
+  cursor: pointer;
+  transition: all 0.3s ease;
+}
+
+.overdue-item:hover {
+  transform: translateX(4px);
+  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+}
+
+.overdue-item.mild {
+  border-left-color: #ff9500;
+}
+
+.overdue-item.warning {
+  border-left-color: #ff6b00;
+}
+
+.overdue-item.severe {
+  border-left-color: #ff3b30;
+}
+
+.overdue-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 12px;
+}
+
+.project-info {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+}
+
+.project-name {
+  font-size: 16px;
+  font-weight: 600;
+  color: #1c1c1e;
+}
+
+.project-id {
+  font-size: 12px;
+  color: #8e8e93;
+}
+
+.overdue-badge {
+  padding: 6px 12px;
+  border-radius: 8px;
+  font-size: 12px;
+  font-weight: 600;
+  color: white;
+}
+
+.overdue-badge.mild {
+  background-color: #ff9500;
+}
+
+.overdue-badge.warning {
+  background-color: #ff6b00;
+}
+
+.overdue-badge.severe {
+  background-color: #ff3b30;
+}
+
+.overdue-content {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 16px;
+  margin-bottom: 12px;
+}
+
+.overdue-detail {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.detail-label {
+  font-size: 13px;
+  color: #8e8e93;
+}
+
+.detail-value {
+  font-size: 13px;
+  font-weight: 500;
+  color: #1c1c1e;
+}
+
+.detail-value.stage-badge {
+  padding: 4px 10px;
+  background-color: #f2f2f7;
+  border-radius: 6px;
+}
+
+.detail-value.reason {
+  color: #ff3b30;
+  font-weight: 600;
+}
+
+.overdue-action {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.view-detail-text {
+  font-size: 14px;
+  color: #007aff;
+  font-weight: 500;
+}
+
+/* 人效统计看板 */
+.efficiency-dashboard {
+  margin-bottom: 32px;
+}
+
+.efficiency-dashboard h3 {
+  font-size: 18px;
+  font-weight: 600;
+  color: #1c1c1e;
+  margin-bottom: 16px;
+}
+
+.efficiency-list {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+}
+
+.efficiency-item {
+  background-color: #ffffff;
+  border-radius: 16px;
+  padding: 24px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+  cursor: pointer;
+  transition: all 0.3s ease;
+}
+
+.efficiency-item:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.1);
+}
+
+.efficiency-header {
+  margin-bottom: 20px;
+}
+
+.designer-info {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+
+.designer-name {
+  font-size: 18px;
+  font-weight: 600;
+  color: #1c1c1e;
+}
+
+.designer-stats-summary {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+
+.stat-chip {
+  padding: 6px 12px;
+  border-radius: 8px;
+  font-size: 12px;
+  font-weight: 600;
+  color: white;
+}
+
+.stat-chip.overdue {
+  background-color: #ff3b30;
+}
+
+.stat-chip.idle {
+  background-color: #ff9500;
+}
+
+/* 阶段利用率 */
+.stage-utilization {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+  gap: 16px;
+  margin-bottom: 20px;
+}
+
+.utilization-item {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.utilization-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.stage-label {
+  font-size: 13px;
+  font-weight: 500;
+  color: #6c6c70;
+}
+
+.utilization-value {
+  font-size: 14px;
+  font-weight: 600;
+  color: #1c1c1e;
+}
+
+.utilization-bar {
+  height: 8px;
+  background-color: #f2f2f7;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+.utilization-fill {
+  height: 100%;
+  border-radius: 4px;
+  transition: width 0.5s ease, background-color 0.3s ease;
+}
+
+/* 决策建议 */
+.efficiency-suggestion {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 16px;
+  background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);
+  border-radius: 12px;
+}
+
+.suggestion-icon {
+  font-size: 24px;
+}
+
+.suggestion-text {
+  flex: 1;
+  font-size: 14px;
+  font-weight: 500;
+  color: #1c1c1e;
+}
+
+/* 警告卡片样式 */
+.overview-card.warning-card {
+  border: 2px solid #ff3b30;
+  background: linear-gradient(135deg, #fff5f5 0%, #ffe5e5 100%);
+}
+
+.overview-card.warning-card .card-value {
+  color: #ff3b30;
+}
+
+/* 精美悬浮按钮 */
+.floating-review-btn {
+  position: fixed;
+  bottom: 32px;
+  right: 32px;
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 16px 24px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  color: white;
+  border: none;
+  border-radius: 50px;
+  font-size: 16px;
+  font-weight: 600;
+  box-shadow: 0 8px 32px rgba(102, 126, 234, 0.4);
+  cursor: pointer;
+  transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  z-index: 1000;
+  overflow: hidden;
+}
+
+.floating-review-btn:hover {
+  transform: translateY(-4px) scale(1.05);
+  box-shadow: 0 12px 48px rgba(102, 126, 234, 0.6);
+}
+
+.floating-review-btn:active {
+  transform: translateY(-2px) scale(1.02);
+}
+
+.floating-btn-icon {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 28px;
+  height: 28px;
+  background-color: rgba(255, 255, 255, 0.2);
+  border-radius: 50%;
+  transition: all 0.3s ease;
+}
+
+.floating-review-btn:hover .floating-btn-icon {
+  background-color: rgba(255, 255, 255, 0.3);
+  transform: rotate(360deg);
+}
+
+.floating-btn-text {
+  font-weight: 600;
+  letter-spacing: 0.5px;
+}
+
+/* 脉冲动画效果 */
+.floating-btn-pulse {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 50px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  opacity: 0;
+  z-index: -1;
+  animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+  0% {
+    transform: scale(1);
+    opacity: 0.7;
+  }
+  50% {
+    transform: scale(1.15);
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 0;
+  }
+}
+
+/* 悬浮按钮响应式 */
+@media (max-width: 768px) {
+  .floating-review-btn {
+    bottom: 20px;
+    right: 20px;
+    padding: 14px 20px;
+    font-size: 14px;
+  }
+
+  .floating-btn-text {
+    display: none;
+  }
+
+  .floating-btn-icon {
+    width: 24px;
+    height: 24px;
+  }
+
+  .floating-review-btn {
+    border-radius: 50%;
+    padding: 16px;
+  }
+}
+
+/* 渐入动画 */
+@keyframes fadeInUp {
+  from {
+    opacity: 0;
+    transform: translateY(30px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+.complexity-card,
+.overdue-item,
+.efficiency-item {
+  animation: fadeInUp 0.6s ease-out;
+}
+
+.complexity-card:nth-child(2) {
+  animation-delay: 0.1s;
+}
+
+.complexity-card:nth-child(3) {
+  animation-delay: 0.2s;
+}
+
+.complexity-card:nth-child(4) {
+  animation-delay: 0.3s;
+}
+
+/* 响应式调整 */
+@media (max-width: 1024px) {
+  .stage-utilization {
+    grid-template-columns: repeat(2, 1fr);
+  }
+}
+
+@media (max-width: 768px) {
+  .complexity-cards {
+    grid-template-columns: 1fr;
+  }
+
+  .stage-utilization {
+    grid-template-columns: 1fr;
+  }
+
+  .time-dimension-filter {
+    width: 100%;
+  }
+
+  .dimension-btn {
+    flex: 1;
+  }
 }

+ 362 - 14
src/app/pages/finance/dashboard/dashboard.ts

@@ -5,6 +5,43 @@ import { AuthService } from '../../../services/auth.service';
 import { WorkHourService } from '../../../services/work-hour.service';
 import { WorkHourDashboardData, MonthlyWorkHourStats, PerformanceLevel } from '../../../models/work-hour.model';
 
+// 项目复杂度类型
+interface ProjectComplexity {
+  type: string; // '家装小户型' | '家装大户型' | '工装商铺' | '工装写字楼'
+  standardHours: {
+    requirementDeepening: number;
+    modeling: number;
+    rendering: number;
+    postProduction: number;
+  };
+}
+
+// 逾期项目信息
+interface OverdueProject {
+  id: string;
+  name: string;
+  stage: string;
+  overdueDays: number;
+  reason: string;
+  designerName: string;
+}
+
+// 设计师效率统计
+interface DesignerEfficiency {
+  id: string;
+  name: string;
+  avgCompletionTime: number; // 天
+  overdueProjectCount: number;
+  stageUtilization: {
+    requirementDeepening: number; // 百分比
+    modeling: number;
+    rendering: number;
+    postProduction: number;
+  };
+  idleDays: number; // 闲置天数
+  suggestion: string;
+}
+
 @Component({
   selector: 'app-dashboard',
   imports: [CommonModule, RouterModule],
@@ -40,6 +77,82 @@ export class Dashboard implements OnInit {
   monthlyStats = signal<MonthlyWorkHourStats[]>([]);
   showWorkHourModule = signal(false);
 
+  // 新增:项目复杂度预设标准工时
+  projectComplexities: ProjectComplexity[] = [
+    {
+      type: '家装小户型',
+      standardHours: { requirementDeepening: 16, modeling: 40, rendering: 24, postProduction: 8 }
+    },
+    {
+      type: '家装大户型',
+      standardHours: { requirementDeepening: 24, modeling: 64, rendering: 40, postProduction: 16 }
+    },
+    {
+      type: '工装商铺',
+      standardHours: { requirementDeepening: 32, modeling: 80, rendering: 48, postProduction: 16 }
+    },
+    {
+      type: '工装写字楼',
+      standardHours: { requirementDeepening: 40, modeling: 120, rendering: 72, postProduction: 24 }
+    }
+  ];
+
+  // 新增:逾期项目列表
+  overdueProjects = signal<OverdueProject[]>([
+    { id: 'P001', name: '现代简约三居室', stage: '渲染', overdueDays: 2, reason: '客户需求变更', designerName: '张设计' },
+    { id: 'P002', name: '商业办公空间', stage: '建模', overdueDays: 5, reason: '资源不足', designerName: '李设计' },
+    { id: 'P003', name: '北欧风格两居室', stage: '后期', overdueDays: 1, reason: '客户需求变更', designerName: '王设计' }
+  ]);
+
+  // 新增:设计师效率统计
+  designerEfficiencies = signal<DesignerEfficiency[]>([
+    {
+      id: 'D001',
+      name: '张设计',
+      avgCompletionTime: 18,
+      overdueProjectCount: 1,
+      stageUtilization: { requirementDeepening: 85, modeling: 92, rendering: 78, postProduction: 88 },
+      idleDays: 3,
+      suggestion: '表现优秀,可适当增加项目难度'
+    },
+    {
+      id: 'D002',
+      name: '李设计',
+      avgCompletionTime: 25,
+      overdueProjectCount: 2,
+      stageUtilization: { requirementDeepening: 70, modeling: 65, rendering: 72, postProduction: 80 },
+      idleDays: 8,
+      suggestion: '近30天闲置8天,建议分配更多项目'
+    },
+    {
+      id: 'D003',
+      name: '王设计',
+      avgCompletionTime: 15,
+      overdueProjectCount: 0,
+      stageUtilization: { requirementDeepening: 95, modeling: 90, rendering: 93, postProduction: 92 },
+      idleDays: 1,
+      suggestion: '高效能设计师,建议承接重点项目'
+    },
+    {
+      id: 'D004',
+      name: '赵设计',
+      avgCompletionTime: 22,
+      overdueProjectCount: 1,
+      stageUtilization: { requirementDeepening: 80, modeling: 75, rendering: 70, postProduction: 85 },
+      idleDays: 10,
+      suggestion: '需要提升渲染阶段效率,建议参加培训'
+    }
+  ]);
+
+  // 时间筛选维度
+  timeDimension = signal<'week' | 'month' | 'quarter'>('month');
+
+  // 显示悬浮按钮
+  showFloatingButton = signal(true);
+
+  // 当前激活的导航项
+  activeNavItem = signal<string>('');
+
   constructor(private authService: AuthService, private workHourService: WorkHourService, private router: Router) {}
 
   ngOnInit(): void {
@@ -91,18 +204,27 @@ export class Dashboard implements OnInit {
   handleTaskClick(task: any) {
     // 检查财务相关任务的权限
     if ((task.title === '临时收款待核定' || task.title === '报价待审核') && !this.checkUserRole('teamLead')) {
-      console.warn('权限不足:只有组长可以处理此任务');
+      alert('⚠️ 权限不足\n\n只有组长及以上权限可以处理此任务\n\n请联系管理员申请权限');
       return;
     }
     
-    // 根据任务来源跳转到对应页面
-    switch(task.source) {
-      case 'reconciliation':
-        window.location.href = '/finance/reconciliation';
-        break;
-      case 'project-records':
-        window.location.href = '/finance/project-records';
-        break;
+    // 显示任务详情
+    const taskDetails = `📋 待办任务详情\n\n任务:${task.title}\n优先级:${task.priority === 'high' ? '高' : task.priority === 'medium' ? '中' : '低'}\n截止时间:${task.time}\n\n是否立即处理此任务?`;
+    
+    if (confirm(taskDetails)) {
+      // 根据任务来源跳转到对应页面
+      switch(task.source) {
+        case 'reconciliation':
+          alert('🔄 正在跳转到对账管理页面...');
+          // window.location.href = '/finance/reconciliation';
+          break;
+        case 'project-records':
+          alert('🔄 正在跳转到项目记录页面...');
+          // window.location.href = '/finance/project-records';
+          break;
+        default:
+          alert(`📌 任务已标记\n\n任务"${task.title}"已加入处理队列`);
+      }
     }
   }
 
@@ -110,26 +232,119 @@ export class Dashboard implements OnInit {
   handleQuickAction(action: string) {
     // 检查权限
     if ((action === 'recordPayment' || action === 'generateReport') && !this.checkUserRole('teamLead')) {
-      console.warn('权限不足:只有组长可以执行此操作');
+      alert('⚠️ 权限不足\n\n只有组长及以上权限可以执行此操作\n\n请联系管理员申请权限');
       return;
     }
     
+    // 设置当前激活的导航项
+    this.activeNavItem.set(action);
+    
     switch(action) {
       case 'newQuote':
-        window.location.href = '/finance/project-records';
+        this.showNewQuoteDialog();
         break;
       case 'recordPayment':
-        window.location.href = '/finance/reconciliation';
+        this.showRecordPaymentDialog();
         break;
       case 'generateReport':
-        window.location.href = '/finance/reports';
+        this.showGenerateReportDialog();
         break;
       case 'quotationApproval':
-        this.router.navigate(['/finance/quotation-approval']);
+        const confirmNavigation = confirm('💼 即将跳转到报价审核页面\n\n是否继续?');
+        if (confirmNavigation) {
+          this.router.navigate(['/finance/quotation-approval']);
+        }
         break;
     }
   }
 
+  // 显示新建报价对话框
+  private showNewQuoteDialog(): void {
+    const projectName = prompt('📝 新建报价\n\n请输入项目名称:', '示例项目');
+    if (projectName) {
+      const projectType = prompt('请选择项目类型:\n\n1. 家装-小户型\n2. 家装-大户型\n3. 工装-商铺\n4. 工装-写字楼\n\n请输入数字 1-4:', '1');
+      
+      if (projectType) {
+        alert(`✅ 报价创建成功!\n\n项目名称:${projectName}\n项目类型:${this.getProjectTypeText(projectType)}\n\n系统正在为您准备报价模板...`);
+        console.log('创建报价:', { projectName, projectType });
+        // window.location.href = '/finance/project-records';
+      }
+    }
+  }
+
+  // 显示记录回款对话框
+  private showRecordPaymentDialog(): void {
+    const amount = prompt('💰 记录回款\n\n请输入回款金额(元):', '');
+    if (amount && !isNaN(Number(amount))) {
+      const paymentMethod = prompt('请选择支付方式:\n\n1. 微信支付\n2. 支付宝\n3. 银行转账\n4. 现金\n\n请输入数字 1-4:', '1');
+      
+      if (paymentMethod) {
+        alert(`✅ 回款记录成功!\n\n回款金额:¥${Number(amount).toLocaleString()}\n支付方式:${this.getPaymentMethodText(paymentMethod)}\n记录时间:${new Date().toLocaleString()}\n\n财务数据已更新`);
+        console.log('记录回款:', { amount, paymentMethod });
+        // window.location.href = '/finance/reconciliation';
+      }
+    }
+  }
+
+  // 显示生成报表对话框
+  private showGenerateReportDialog(): void {
+    const reportType = prompt('📊 生成财务报表\n\n请选择报表类型:\n\n1. 月度收入报表\n2. 项目利润分析\n3. 回款统计报表\n4. 成本费用报表\n\n请输入数字 1-4:', '1');
+    
+    if (reportType) {
+      const period = prompt('请选择时间周期:\n\n1. 本月\n2. 上月\n3. 本季度\n4. 本年度\n\n请输入数字 1-4:', '1');
+      
+      if (period) {
+        alert(`✅ 报表生成成功!\n\n报表类型:${this.getReportTypeText(reportType)}\n时间周期:${this.getPeriodText(period)}\n生成时间:${new Date().toLocaleString()}\n\n报表正在下载,请稍候...`);
+        console.log('生成报表:', { reportType, period });
+        // window.location.href = '/finance/reports';
+      }
+    }
+  }
+
+  // 辅助方法:获取项目类型文本
+  private getProjectTypeText(type: string): string {
+    const types: Record<string, string> = {
+      '1': '家装-小户型',
+      '2': '家装-大户型',
+      '3': '工装-商铺',
+      '4': '工装-写字楼'
+    };
+    return types[type] || '未知类型';
+  }
+
+  // 辅助方法:获取支付方式文本
+  private getPaymentMethodText(method: string): string {
+    const methods: Record<string, string> = {
+      '1': '微信支付',
+      '2': '支付宝',
+      '3': '银行转账',
+      '4': '现金'
+    };
+    return methods[method] || '未知方式';
+  }
+
+  // 辅助方法:获取报表类型文本
+  private getReportTypeText(type: string): string {
+    const types: Record<string, string> = {
+      '1': '月度收入报表',
+      '2': '项目利润分析',
+      '3': '回款统计报表',
+      '4': '成本费用报表'
+    };
+    return types[type] || '未知报表';
+  }
+
+  // 辅助方法:获取周期文本
+  private getPeriodText(period: string): string {
+    const periods: Record<string, string> = {
+      '1': '本月',
+      '2': '上月',
+      '3': '本季度',
+      '4': '本年度'
+    };
+    return periods[period] || '未知周期';
+  }
+
   // 格式化金额显示
   formatAmount(amount: number): string {
     return new Intl.NumberFormat('zh-CN', { style: 'currency', currency: 'CNY' }).format(amount);
@@ -195,4 +410,137 @@ export class Dashboard implements OnInit {
       return `${remainingHours}小时`;
     }
   }
+
+  // 新增:获取标准工时
+  getStandardHours(complexityType: string): ProjectComplexity | undefined {
+    return this.projectComplexities.find(c => c.type === complexityType);
+  }
+
+  // 新增:获取逾期预警样式类
+  getOverdueClass(days: number): string {
+    if (days >= 5) return 'severe';
+    if (days >= 3) return 'warning';
+    return 'mild';
+  }
+
+  // 新增:切换时间维度
+  setTimeDimension(dimension: 'week' | 'month' | 'quarter'): void {
+    this.timeDimension.set(dimension);
+    // 重新加载数据
+    this.loadWorkHourData();
+  }
+
+  // 新增:获取时间维度文本
+  getTimeDimensionText(): string {
+    const dimension = this.timeDimension();
+    const texts = {
+      week: '本周',
+      month: '本月',
+      quarter: '本季度'
+    };
+    return texts[dimension];
+  }
+
+  // 新增:导出逾期分析报表
+  exportOverdueReport(): void {
+    const dimension = this.getTimeDimensionText();
+    const projects = this.overdueProjects();
+    const overdueCount = projects.length;
+    const totalOverdueDays = projects.reduce((sum: number, p: OverdueProject) => sum + p.overdueDays, 0);
+    const avgOverdueDays = overdueCount > 0 ? (totalOverdueDays / overdueCount).toFixed(1) : '0';
+    
+    alert(`📊 导出逾期分析报表
+    
+时间范围:${dimension}
+逾期项目数:${overdueCount} 个
+总逾期天数:${totalOverdueDays} 天
+平均逾期天数:${avgOverdueDays} 天
+
+主要逾期原因:
+${projects.slice(0, 3).map((p: OverdueProject, i: number) => `${i + 1}. ${p.name}:${p.reason}`).join('\n')}
+
+报表已生成,正在下载...`);
+    
+    console.log('导出逾期分析报表:', { dimension, overdueCount, avgOverdueDays });
+  }
+
+  // 新增:查看项目详情
+  viewProjectDetail(projectId: string): void {
+    this.router.navigate(['/designer/project-detail', projectId], {
+      queryParams: { tab: 'aftercare', view: 'review-only' }
+    });
+  }
+
+  // 新增:查看设计师详情
+  viewDesignerDetail(designerId: string): void {
+    const designers = this.designerEfficiencies();
+    const designer = designers.find((d: DesignerEfficiency) => d.id === designerId);
+    if (!designer) return;
+    
+    // 将对象转换为可读的利用率信息
+    const utilizationDetails = [
+      `  需求深化:${designer.stageUtilization.requirementDeepening}%`,
+      `  建模阶段:${designer.stageUtilization.modeling}%`,
+      `  渲染阶段:${designer.stageUtilization.rendering}%`,
+      `  后期处理:${designer.stageUtilization.postProduction}%`
+    ].join('\n');
+    
+    // 计算效率等级
+    const avgUtilization = (
+      designer.stageUtilization.requirementDeepening +
+      designer.stageUtilization.modeling +
+      designer.stageUtilization.rendering +
+      designer.stageUtilization.postProduction
+    ) / 4;
+    
+    const efficiencyLevel = avgUtilization >= 90 ? '优秀' : 
+                           avgUtilization >= 75 ? '良好' : 
+                           avgUtilization >= 60 ? '中等' : '待提升';
+    
+    alert(`👨‍💼 设计师效率详情
+
+姓名:${designer.name}
+效率等级:${efficiencyLevel} (平均利用率: ${avgUtilization.toFixed(1)}%)
+平均完成时长:${designer.avgCompletionTime}天
+当前闲置天数:${designer.idleDays}天
+逾期项目数:${designer.overdueProjectCount}个
+
+各阶段工时利用率:
+${utilizationDetails}
+
+${designer.suggestion}
+
+点击确定查看更多详情...`);
+    
+    console.log('查看设计师详情:', designer);
+    // TODO: 跳转到设计师详情页
+  }
+
+  // 新增:跳转到售后复盘(悬浮按钮)
+  goToAftercare(): void {
+    // 这里使用一个示例项目ID,实际应该从列表中选择或最近的项目
+    const projectId = 'P001';
+    this.router.navigate(['/designer/project-detail', projectId], {
+      queryParams: { 
+        view: 'review-only',  // 只读复盘模式
+        section: 'aftercare'  // 直接定位到售后板块
+      }
+    });
+  }
+
+  // 新增:获取效率等级颜色
+  getEfficiencyLevelColor(avgTime: number): string {
+    if (avgTime <= 15) return '#34c759'; // 优秀 - 绿色
+    if (avgTime <= 20) return '#30b0c7'; // 良好 - 青色
+    if (avgTime <= 25) return '#ff9500'; // 一般 - 橙色
+    return '#ff3b30'; // 需提升 - 红色
+  }
+
+  // 新增:获取阶段利用率颜色
+  getUtilizationColor(percentage: number): string {
+    if (percentage >= 90) return '#34c759';
+    if (percentage >= 75) return '#30b0c7';
+    if (percentage >= 60) return '#ff9500';
+    return '#ff3b30';
+  }
 }

+ 7 - 0
src/app/pages/finance/quotation-approval/quotation-approval.component.html

@@ -12,6 +12,13 @@
         </svg>
         统计报表
       </button>
+      <button type="button" class="btn-primary back-to-dashboard" (click)="backToDashboard()">
+        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
+          <path d="M19 12H5"></path>
+          <polyline points="12 19 5 12 12 5"></polyline>
+        </svg>
+        返回工作台
+      </button>
     </div>
   </div>
 

+ 20 - 0
src/app/pages/finance/quotation-approval/quotation-approval.component.scss

@@ -554,6 +554,26 @@
   }
 }
 
+.back-to-dashboard {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  
+  &:hover:not(:disabled) {
+    background: linear-gradient(135deg, #5568d3 0%, #63408a 100%);
+    box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
+  }
+  
+  svg {
+    transition: transform 0.3s ease;
+  }
+  
+  &:hover svg {
+    transform: translateX(-3px);
+  }
+}
+
 .btn-success {
   background-color: #059669;
   color: white;

+ 10 - 1
src/app/pages/finance/quotation-approval/quotation-approval.component.ts

@@ -1,6 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { FormsModule } from '@angular/forms';
+import { Router } from '@angular/router';
 import { QuotationApprovalService } from '../../../services/quotation-approval.service';
 import { QuotationApproval, QuotationApprovalStatus, CommunicationRecord, ScriptUsageStats } from '../../../services/quotation-approval.service';
 
@@ -45,7 +46,10 @@ export class QuotationApprovalComponent implements OnInit {
   showApprovalModal = false;
   showStatsModal = false;
 
-  constructor(private quotationApprovalService: QuotationApprovalService) {}
+  constructor(
+    private quotationApprovalService: QuotationApprovalService,
+    private router: Router
+  ) {}
 
   ngOnInit() {
     this.loadQuotationApprovals();
@@ -271,4 +275,9 @@ export class QuotationApprovalComponent implements OnInit {
     };
     return classMap[status] || '';
   }
+
+  // 返回财务工作台
+  backToDashboard(): void {
+    this.router.navigate(['/finance/dashboard']);
+  }
 }

+ 2 - 2
src/app/pages/team-leader/dashboard/dashboard.ts

@@ -140,7 +140,7 @@ export class Dashboard implements OnInit, OnDestroy {
 
   // 5大核心阶段(聚合展示)
   corePhases: ProjectStage[] = [
-    { id: 'order', name: '订单创建', order: 1 },        // 待确认、待分配
+    { id: 'order', name: '订单分配', order: 1 },        // 待确认、待分配
     { id: 'requirements', name: '确认需求', order: 2 },  // 需求沟通、方案规划
     { id: 'delivery', name: '交付执行', order: 3 },      // 建模、渲染、后期/评审/修改
     { id: 'aftercare', name: '售后', order: 4 }          // 交付完成 → 售后
@@ -1382,7 +1382,7 @@ export class Dashboard implements OnInit, OnDestroy {
 
   // 新增:阶段到核心阶段的映射
   private mapStageToCorePhase(stageId: string): 'order' | 'requirements' | 'delivery' | 'aftercare' {
-    // 订单创建:立项初期
+    // 订单分配:立项初期
     if (stageId === 'pendingApproval' || stageId === 'pendingAssignment') return 'order';
     // 确认需求:需求沟通 + 方案规划
     if (stageId === 'requirement' || stageId === 'planning') return 'requirements';

+ 1 - 1
src/app/pages/team-leader/workload-calendar/workload-calendar.ts

@@ -275,7 +275,7 @@ export class WorkloadCalendarComponent implements OnInit, OnDestroy {
   // 新增:阶段归并规则(标准化为5大阶段)
   private stageToPhase(s: ProjectStage, isCompleted = false): '待分配' | '需求方案' | '执行' | '收尾验收' | '归档' {
     switch (s) {
-      case '订单创建':
+      case '订单分配':
         return '待分配';
       case '需求沟通':
       case '方案确认':

+ 3 - 3
src/app/shared/components/consultation-order-panel/consultation-order-panel.component.ts

@@ -561,7 +561,7 @@ export class ConsultationOrderPanelComponent implements OnInit, OnChanges {
       createdAt: new Date()
     };
     
-    // 先触发订单创建事件(用于数据同步)
+    // 先触发订单分配事件(用于数据同步)
     this.orderCreated.emit(formData);
     
     // 再触发项目创建成功事件(用于阶段推进)
@@ -593,7 +593,7 @@ export class ConsultationOrderPanelComponent implements OnInit, OnChanges {
     this.showTeamAssignmentModal = false;
   }
 
-  // 确认团队分配 - 优化流程:同时触发订单创建和项目创建事件
+  // 确认团队分配 - 优化流程:同时触发订单分配和项目创建事件
   confirmTeamAssignment(designer: Designer) {
     this.selectedDesigner = designer;
     this.showTeamAssignmentModal = false;
@@ -619,7 +619,7 @@ export class ConsultationOrderPanelComponent implements OnInit, OnChanges {
       createdAt: new Date()
     };
     
-    // 先触发订单创建事件(用于数据同步)
+    // 先触发订单分配事件(用于数据同步)
     this.orderCreated.emit(formData);
     
     // 再触发项目创建成功事件(用于阶段推进)