APPROVAL_STATUS_AUTO_FIX.md 8.0 KB

审批状态自动修复与持久化方案

🎯 核心需求

用户要求

既然是进入到需求确认阶段的项目,那么他们上一个环节的审批状态就应该是审批通过的,请你正确标记,不管是点击导航订单分配查看还是怎么样,数据应该是持久化保存的。

问题描述

  • 项目已推进到"确认需求"阶段
  • data.approvalStatus 字段未正确保存为 'approved'
  • 每次查看订单分配页面时,虽然智能判定能判断为 'approved',但这只是临时判定
  • 数据未持久化保存到数据库

✅ 完整修复方案

修复位置

文件stage-order.component.ts
方法loadData() (第499-546行)

修复逻辑

情况1:项目已推进到后续阶段 → 自动修复并持久化

// 检查:如果项目已在"确认需求"、"交付执行"、"售后归档"等后续阶段
if (currentStage && !['订单分配', '未分配', '新建'].includes(currentStage)) {
  
  // 检查审批状态是否正确
  if (data.approvalStatus !== 'approved') {
    
    // 🔥 步骤1:设置审批状态为已通过
    data.approvalStatus = 'approved';
    
    // 🔥 步骤2:添加审批历史记录(如果不存在)
    const approvalHistory = data.approvalHistory || [];
    const hasOrderApproval = approvalHistory.some(h => 
      h.stage === '订单分配' && h.status === 'approved'
    );
    
    if (!hasOrderApproval) {
      approvalHistory.push({
        stage: '订单分配',
        status: 'approved',
        autoFixed: true,  // 标记为自动修复
        fixTime: new Date(),
        reason: '项目已推进到后续阶段,自动修复订单分配审批状态'
      });
      data.approvalHistory = approvalHistory;
    }
    
    // 🔥 步骤3:持久化保存到数据库
    this.project.set('data', data);
    await this.project.save();
    
    console.log('✅ [自动修复] 审批状态已持久化保存到数据库');
  }
}

情况2:项目仍在订单分配阶段 → 初始化为未提交

else if (currentStage === '订单分配' && data.approvalStatus === undefined) {
  data.approvalStatus = null;  // 未提交状态
  data.approvalHistory = data.approvalHistory || [];
  // 不保存到数据库,等用户提交订单时再保存
}

📊 数据流程

修复前 ❌

项目推进到"确认需求"
  ↓
data.approvalStatus = undefined 或 'pending'  ❌
  ↓
用户点击"订单分配"导航
  ↓
getApprovalStatus() 智能判定返回 'approved' (临时)
  ↓
刷新页面后,又回到 'pending'  ❌

修复后 ✅

项目推进到"确认需求"
  ↓
loadData() 检测到阶段不匹配
  ↓
自动修复:data.approvalStatus = 'approved'
  ↓
持久化保存到数据库  ✅
  ↓
用户点击"订单分配"导航
  ↓
直接读取 data.approvalStatus = 'approved'  ✅
  ↓
刷新页面后,状态仍为 'approved'  ✅

🔍 控制台日志

自动修复时

🔧 [自动修复] 项目已在 "确认需求" 阶段,但审批状态为: pending → 自动修复为 approved

✅ [自动修复] 已添加审批历史记录

✅ [自动修复] 审批状态已持久化保存到数据库

数据正确时

✅ [数据检查] 项目在 "确认需求" 阶段,审批状态正确: approved

订单分配阶段初始化

🔧 [初始化] 订单分配阶段但无审批状态,初始化为null(未提交)

🎯 修复效果

1. 数据持久化 ✅

修复前

  • 审批状态只存在于临时判定中
  • 刷新页面后状态丢失

修复后

  • 审批状态自动保存到数据库
  • 跨页面、跨会话保持一致

2. 状态一致性 ✅

修复前

🔍 【审批状态检查】
  原始审批状态: 'pending'    ❌
  最终判定状态: 'approved'   ⚠️ 临时判定

修复后

🔍 【审批状态检查】
  原始审批状态: 'approved'   ✅
  最终判定状态: 'approved'   ✅

3. 审批历史完整 ✅

修复前

data.approvalHistory: []  // 空数组或缺少订单分配记录

修复后

data.approvalHistory: [
  {
    stage: '订单分配',
    status: 'approved',
    autoFixed: true,
    fixTime: '2024-11-17T16:47:00.000Z',
    reason: '项目已推进到后续阶段,自动修复订单分配审批状态'
  }
]

📋 验证步骤

测试场景1:已推进项目的自动修复

  1. 准备数据

    • 项目当前阶段:确认需求
    • 审批状态:pending 或 undefined
  2. 操作

    • 进入项目详情页
    • 点击"订单分配"导航
  3. 预期结果

    // 控制台输出
    🔧 [自动修复] 项目已在 "确认需求" 阶段,但审批状态为: pending → 自动修复为 approved
    ✅ [自动修复] 审批状态已持久化保存到数据库
       
    // 页面显示
    ✅ 审批已通过(绿色横幅)
    
  4. 验证持久化

    • 刷新页面
    • 重新进入项目
    • 审批状态仍为 'approved' ✅

测试场景2:订单分配阶段的新项目

  1. 准备数据

    • 项目当前阶段:订单分配
    • 审批状态:undefined
  2. 操作

    • 进入项目详情页
  3. 预期结果

    // 控制台输出
    🔧 [初始化] 订单分配阶段但无审批状态,初始化为null(未提交)
       
    // 页面显示
    正常显示报价表单和"确认订单"按钮
    

测试场景3:数据正确的项目

  1. 准备数据

    • 项目当前阶段:确认需求
    • 审批状态:approved
  2. 操作

    • 进入项目详情页
    • 点击"订单分配"导航
  3. 预期结果

    // 控制台输出
    ✅ [数据检查] 项目在 "确认需求" 阶段,审批状态正确: approved
       
    // 页面显示
    ✅ 审批已通过(绿色横幅)
    

🔧 技术细节

自动修复时机

触发条件

  1. 页面加载时(ngOnInitloadData()
  2. 检测到 currentStage 已超过"订单分配"
  3. data.approvalStatus 不是 'approved'

执行逻辑

  1. 设置 data.approvalStatus = 'approved'
  2. 检查并添加审批历史记录
  3. 调用 project.save() 持久化保存

为什么选择在 loadData() 中修复?

优势

  1. ✅ 每次加载页面都会检查和修复
  2. ✅ 确保数据一致性
  3. ✅ 不影响现有的审批流程
  4. ✅ 兼容历史数据

劣势

  • 可能会执行多次修复(但有检查逻辑,不会重复保存)

自动修复 vs 智能判定

特性 智能判定 (getApprovalStatus) 自动修复 (loadData)
数据持久化 ❌ 临时判定,不保存 ✅ 保存到数据库
跨页面一致 ❌ 每次都需要重新判定 ✅ 加载即可直接读取
审批历史 ❌ 不添加记录 ✅ 自动补充记录
性能 ✅ 轻量级判定 ⚠️ 需要保存操作
适用场景 显示层逻辑 数据层修复

🎊 总结

修复内容

  1. ✅ 在 loadData() 中添加自动修复逻辑
  2. ✅ 检测项目阶段与审批状态的不匹配
  3. ✅ 自动设置 data.approvalStatus = 'approved'
  4. ✅ 补充审批历史记录
  5. ✅ 持久化保存到数据库

修复效果

  1. ✅ 审批状态正确标记
  2. ✅ 数据持久化保存
  3. ✅ 跨页面状态一致
  4. ✅ 审批历史完整
  5. ✅ 支持历史数据自动修复

修复已完成,数据已持久化保存! 🚀

下一步

请刷新页面并测试以下场景:

  1. 已推进项目:进入"确认需求"或后续阶段的项目,点击"订单分配"导航,应显示"审批已通过"
  2. 刷新验证:刷新页面后,审批状态仍为"已通过"
  3. 控制台日志:查看是否有自动修复的日志输出

如有任何问题,请提供控制台日志!