stagnation-modification-ui-enhancements.md 12 KB

停滞期/改图期 UI 优化实现文档

📋 需求概述

  1. 在"改图工单"按钮旁边显示停滞期/改图期状态标记
  2. 添加可点击的取消按钮(底部显示,仅组长和客服可见)
  3. 小屏幕优化(防止状态标记被遮挡)
  4. 自动取消改图期(组员上传图片并确认交付清单后)

✅ 已实现功能

1. 状态标记显示(改图工单按钮旁)

位置stage-delivery-execution.component.html 第21-58行

功能

  • ✅ 改图期标记:黄色渐变徽章,显示原因
  • ✅ 停滞期标记:红色渐变徽章,显示原因和预计恢复日期
  • ✅ 小屏幕自动隐藏详细原因(只显示"改图期"/"停滞期"文字)

示例代码

<!-- 🆕 停滞期/改图期状态标记 -->
@if (project?.data?.isModification) {
  <div class="project-status-badge modification-badge">
    <svg>...</svg>
    <span class="badge-text">改图期</span>
    <span class="badge-reason">设计师原因</span>
  </div>
}
@if (project?.data?.isStalled) {
  <div class="project-status-badge stalled-badge">
    <svg>...</svg>
    <span class="badge-text">停滞期</span>
    <span class="badge-reason">客户原因</span>
    <span class="badge-date">12/15恢复</span>
  </div>
}

2. 取消按钮(底部)

位置stage-delivery-execution.component.html 第245-267行

功能

  • ✅ 仅组长和客服可见(isTeamLeader || isFromCustomerService
  • ✅ 点击后弹出确认对话框
  • ✅ 清除数据库中的停滞期/改图期标记
  • ✅ 自动刷新数据

示例代码

<!-- 🆕 取消停滞期/改图期按钮 -->
@if (project?.data?.isStalled && (isTeamLeader || isFromCustomerService)) {
  <button class="cancel-status-btn stalled-cancel" (click)="cancelStagnation()">
    <svg>...</svg>
    <span>取消停滞期</span>
  </button>
}
@if (project?.data?.isModification && (isTeamLeader || isFromCustomerService)) {
  <button class="cancel-status-btn modification-cancel" (click)="cancelModification()">
    <svg>...</svg>
    <span>取消改图期</span>
  </button>
}

3. 取消功能实现

文件stage-delivery-execution.component.ts

cancelStagnation() - 第1149-1194行

async cancelStagnation(): Promise<void> {
  if (!this.project) return;
  
  const confirmed = confirm('确定要取消该项目的停滞期状态吗?');
  if (!confirmed) return;
  
  this.saving = true;
  
  try {
    const query = new Parse.Query('Project');
    const projectObj = await query.get(this.project.id);
    
    const projectData = projectObj.get('data') || {};
    
    // 清除停滞期相关字段
    projectData.isStalled = false;
    delete projectData.stagnationReasonType;
    delete projectData.stagnationCustomReason;
    delete projectData.estimatedResumeDate;
    delete projectData.reasonNotes;
    delete projectData.markedAt;
    delete projectData.markedBy;
    
    projectObj.set('data', projectData);
    await projectObj.save();
    
    alert('停滞期状态已取消');
    this.refreshData.emit();
  } catch (error) {
    console.error('取消停滞期失败:', error);
    alert('取消停滞期失败,请重试');
  } finally {
    this.saving = false;
    this.cdr.markForCheck();
  }
}

cancelModification() - 第1199-1243行

async cancelModification(): Promise<void> {
  // 类似 cancelStagnation,清除改图期相关字段
}

4. 自动取消改图期

4.1 文件上传时自动取消

文件stage-delivery.component.ts 第441-487行

逻辑

async onFileUploaded(event: { productId: string, deliveryType: string, fileCount: number }) {
  if (event.fileCount > 0 && this.project) {
    const projectData = this.project.get('data') || {};
    
    // 🆕 检查是否处于改图期,如果是则自动取消
    if (projectData.isModification === true) {
      console.log('🎨 [改图期] 上传文件后自动取消改图期标记');
      
      projectData.isModification = false;
      projectData.modificationReasonType = undefined;
      projectData.modificationCustomReason = undefined;
      
      await this.project.save();
      console.log('✅ [改图期] 改图期标记已取消');
    }
  }
}

4.2 确认交付清单时自动取消

文件stage-delivery-execution.component.ts 第975-983行

逻辑

async confirmSpace(spaceId: string) {
  // ... 确认逻辑
  
  // 🆕 确认交付清单时自动取消改图期标记
  if (data.isModification === true) {
    console.log('🎨 [改图期] 确认交付清单,自动取消改图期标记');
    data.isModification = false;
    delete data.modificationReasonType;
    delete data.modificationCustomReason;
    console.log('✅ [改图期] 改图期标记已取消');
  }
  
  await this.project.save();
}

5. CSS 样式优化

文件stage-delivery-execution.component.scss

5.1 工具栏防遮挡(第12-16行)

.revision-toolbar {
  display: flex;
  flex-wrap: wrap; // 🆕 允许换行,避免小屏幕遮挡
  gap: 8px;
  margin-bottom: 12px;
  align-items: center;
}

5.2 状态徽章样式(第1547-1592行)

.project-status-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 16px;
  font-size: 12px;
  font-weight: 500;
  white-space: nowrap;
  
  &.modification-badge {
    background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
    color: white;
    box-shadow: 0 2px 6px rgba(251, 191, 36, 0.3);
  }
  
  &.stalled-badge {
    background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
    color: white;
    box-shadow: 0 2px 6px rgba(239, 68, 68, 0.3);
  }
  
  // 小屏幕优化
  @media screen and (max-width: 640px) {
    font-size: 11px;
    padding: 4px 10px;
    
    .badge-reason, .badge-date {
      display: none; // 小屏幕隐藏详细原因
    }
  }
}

5.3 取消按钮样式(第1595-1639行)

.cancel-status-btn {
  padding: 8px 14px;
  border: none;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  transition: all 0.2s;
  margin-top: 8px;
  
  &.stalled-cancel {
    background: #fee2e2;
    color: #dc2626;
    border: 1px solid #fecaca;
    
    &:hover:not(:disabled) {
      background: #fecaca;
    }
  }
  
  &.modification-cancel {
    background: #fef3c7;
    color: #d97706;
    border: 1px solid #fde68a;
    
    &:hover:not(:disabled) {
      background: #fde68a;
    }
  }
}

📱 响应式设计

大屏幕(>640px)

  • ✅ 完整显示:状态文字 + 原因 + 日期
  • ✅ 所有元素横向排列

小屏幕(≤640px)

  • ✅ 简化显示:仅显示状态文字("改图期"/"停滞期")
  • ✅ 自动换行:工具栏元素可以换行显示
  • ✅ 不会被遮挡:徽章会显示在新行

🎯 用户体验流程

组长标记停滞期/改图期

  1. 组长在Dashboard标记项目为停滞期/改图期
  2. 保存到数据库(project.data.isStalled / isModification
  3. 项目移动到对应栏(停滞期列/改图期列)

组员查看项目详情

  1. 进入交付执行阶段
  2. 工具栏顶部:看到醒目的状态徽章(改图工单按钮旁)
    • 改图期:🟡 黄色徽章 "改图期 - 设计师原因"
    • 停滞期:🔴 红色徽章 "停滞期 - 客户原因 (12/15恢复)"
  3. 底部:组长/客服可以看到取消按钮

组员上传新图片

  1. 上传图片到任意阶段(白模/软装/渲染/后期)
  2. 系统自动:检测到改图期标记,自动取消
  3. 日志输出:🎨 [改图期] 上传文件后自动取消改图期标记

组员确认交付清单

  1. 点击"✓ 确认清单"按钮
  2. 系统自动:检测到改图期标记,自动取消
  3. 日志输出:🎨 [改图期] 确认交付清单,自动取消改图期标记

组长/客服手动取消

  1. 点击底部"取消停滞期"或"取消改图期"按钮
  2. 确认对话框:确定要取消该项目的停滞期状态吗?
  3. 确认后清除数据库标记
  4. 弹出提示:停滞期状态已取消
  5. 自动刷新数据

🔄 数据流

标记流程

组长Dashboard
  ↓
markProjectAsStalled/Modification
  ↓
updateProjectMarkStatus
  ↓
Parse.save (project.data.isStalled/isModification)
  ↓
Dashboard刷新,项目移动到对应列

取消流程(手动)

组员/组长点击取消按钮
  ↓
cancelStagnation/Modification
  ↓
Parse.save (清除 isStalled/isModification)
  ↓
refreshData.emit()
  ↓
UI刷新,徽章消失

取消流程(自动)

组员上传图片 / 确认清单
  ↓
onFileUploaded / confirmSpace
  ↓
检测 project.data.isModification === true
  ↓
清除改图期字段
  ↓
Parse.save
  ↓
UI刷新,徽章消失

📊 数据库字段

停滞期字段(project.data)

{
  isStalled: boolean;                    // 是否停滞
  stagnationReasonType: string;          // 原因类型:'designer' | 'customer' | 'custom'
  stagnationCustomReason?: string;       // 自定义原因
  estimatedResumeDate?: Date;            // 预计恢复日期
  reasonNotes?: string;                  // 备注
  markedAt?: Date;                       // 标记时间
  markedBy?: string;                     // 标记人
}

改图期字段(project.data)

{
  isModification: boolean;               // 是否改图
  modificationReasonType: string;        // 原因类型:'customer' | 'designer' | 'custom'
  modificationCustomReason?: string;     // 自定义原因
  reasonNotes?: string;                  // 备注
  markedAt?: Date;                       // 标记时间
  markedBy?: string;                     // 标记人
}

🧪 测试建议

测试场景1:状态标记显示

  1. 组长标记项目为改图期
  2. 组员进入项目详情页
  3. ✅ 验证:工具栏显示黄色"改图期"徽章
  4. ✅ 验证:大屏幕显示原因,小屏幕只显示"改图期"

测试场景2:手动取消

  1. 组长点击底部"取消改图期"按钮
  2. ✅ 验证:弹出确认对话框
  3. 确认后
  4. ✅ 验证:徽章消失
  5. ✅ 验证:Dashboard中项目移回正常列

测试场景3:自动取消(上传)

  1. 项目处于改图期
  2. 组员上传新图片
  3. ✅ 验证:控制台输出自动取消日志
  4. ✅ 验证:徽章立即消失
  5. ✅ 验证:数据库中 isModification = false

测试场景4:自动取消(确认)

  1. 项目处于改图期
  2. 组员点击"✓ 确认清单"
  3. ✅ 验证:控制台输出自动取消日志
  4. ✅ 验证:徽章立即消失
  5. ✅ 验证:数据库中 isModification = false

测试场景5:小屏幕响应

  1. 使用手机或缩小浏览器窗口(<640px)
  2. ✅ 验证:工具栏元素可以换行
  3. ✅ 验证:徽章不会被遮挡
  4. ✅ 验证:徽章只显示"改图期"/"停滞期"文字

📝 注意事项

  1. 权限控制

    • 取消按钮仅组长和客服可见
    • 组员只能通过上传/确认自动取消改图期
  2. 数据一致性

    • 停滞期和改图期互斥(设置一个会清除另一个)
    • 取消时保留历史记录字段(markedAt, markedBy)
  3. 日志记录

    • 所有关键操作都有控制台日志
    • 便于追踪和调试
  4. 用户体验

    • 操作前有确认对话框
    • 操作后有成功/失败提示
    • 自动刷新避免数据不同步

🎉 完成状态

  • ✅ 状态徽章显示(改图工单按钮旁)
  • ✅ 取消按钮(底部,仅组长/客服)
  • ✅ 手动取消功能(cancelStagnation/Modification)
  • ✅ 自动取消功能(上传图片时)
  • ✅ 自动取消功能(确认清单时)
  • ✅ 小屏幕响应式优化
  • ✅ CSS样式美化
  • ✅ 权限控制
  • ✅ 日志记录

创建日期:2024-12-07
最后更新:2024-12-07
版本:v1.0