用户反馈:已经经过组长端审批通过的项目,在订单分配阶段仍然显示"等待组长审批"状态,而不是"审批已通过"。
控制台日志显示:
审批状态检查 {
审批状态: 'pending',
是否pending: true,
是否approved: false,
...
}
问题截图分析:
/wxwork/cDL6R1hgSi/project/iKvYck89zE/order通过深入分析,发现了三个关键问题:
原代码:
// 使用 JSON 序列化保存数据
this.project.set('data', JSON.parse(JSON.stringify(data)));
问题:
JSON.parse(JSON.stringify()) 可能会丢失某些特殊类型的数据原代码:
if (!this.project && this.projectId) {
this.project = await query.get(this.projectId);
}
// ❌ 如果 this.project 已存在,不会刷新
问题:
this.project 从父组件传入(可能是旧数据)原代码:
const status = data.approvalStatus || null;
return status; // 直接返回
问题:
data.approvalStatus 为空null 或错误状态修改前:
data.approvalStatus = 'approved';
this.project.set('data', JSON.parse(JSON.stringify(data)));
await this.project.save();
修改后:
data.approvalHistory = approvalHistory;
data.approvalStatus = 'approved';
delete data.lastRejectionReason;
delete data.pendingApprovalBy;
// ⭐ 直接设置 data,不使用 JSON 序列化
this.project.set('data', data);
this.project.set('currentStage', '确认需求');
this.project.set('pendingApproval', false);
console.log('📝 [审批通过] 准备保存项目数据:', {
approvalStatus: data.approvalStatus,
currentStage: '确认需求',
approvalHistoryCount: approvalHistory.length
});
await this.project.save();
console.log('✅ [审批通过] 项目已保存,审批状态:', {
approvalStatus: this.project.get('data')?.approvalStatus,
currentStage: this.project.get('currentStage')
});
关键改进:
JSON.parse(JSON.stringify())pendingApproval 标记修改后的 loadData():
async loadData() {
try {
this.loading = true;
// 首次加载项目数据
if (!this.project && this.projectId) {
const query = new Parse.Query('Project');
query.include('customer', 'assignee', 'department');
this.project = await query.get(this.projectId);
this.customer = this.project.get('customer');
}
// ⭐ 关键修复:强制刷新数据,确保获取最新审批状态
if (this.project && this.project.id) {
try {
console.log('🔄 重新查询项目数据,确保获取最新审批状态...');
const refreshQuery = new Parse.Query('Project');
refreshQuery.include('customer', 'assignee', 'department');
const refreshedProject = await refreshQuery.get(this.project.id);
// 更新当前项目对象
this.project = refreshedProject;
this.customer = refreshedProject.get('customer');
console.log('✅ 项目数据已刷新', {
approvalStatus: this.project.get('data')?.approvalStatus,
currentStage: this.project.get('currentStage')
});
} catch (fetchError) {
console.warn('⚠️ 刷新项目数据失败,使用现有数据:', fetchError);
}
}
// ... 后续逻辑
}
}
关键改进:
this.project 已存在,也会重新查询修改后的 getApprovalStatus():
getApprovalStatus(): 'pending' | 'approved' | 'rejected' | null {
if (!this.project) return null;
const data = this.project.get('data') || {};
let status = data.approvalStatus || null;
const currentStage = this.project.get('currentStage');
// ⭐ 智能判定:如果项目已推进到后续阶段,自动判定为已通过
if (!status && currentStage !== '订单分配') {
status = 'approved';
console.log('🔍 [智能判定] 项目已推进到 "' + currentStage + '" 阶段,订单分配审批必定已通过');
}
// ⭐ 从审批历史中推断状态
if (!status && currentStage === '订单分配' && data.approvalHistory?.length > 0) {
const latestApproval = data.approvalHistory[data.approvalHistory.length - 1];
if (latestApproval?.status === 'approved') {
status = 'approved';
console.log('🔍 [智能判定] 审批历史显示已通过');
} else if (latestApproval?.status === 'rejected') {
status = 'rejected';
console.log('🔍 [智能判定] 审批历史显示已驳回');
} else if (latestApproval?.status === 'pending') {
status = 'pending';
console.log('🔍 [智能判定] 审批历史显示待审批');
}
}
// 详细日志
console.log('🔍 【审批状态检查】', {
'原始审批状态': data.approvalStatus,
'最终判定状态': status,
'当前阶段': currentStage,
'项目ID': this.project.id
});
// 触发视图更新
if (status === 'approved') {
console.log('✅ 订单分配审批已通过');
this.cdr.markForCheck();
}
return status;
}
智能判定逻辑:
┌─────────────────────────────────────────┐
│ 读取 data.approvalStatus │
└────────────┬────────────────────────────┘
│
├─ 已有值?
│ ├─ 是 → 直接使用该值
│ └─ 否 → 继续智能判定
│
├─ currentStage 不是"订单分配"?
│ ├─ 是 → 自动判定为 'approved' ✓
│ └─ 否 → 继续检查
│
├─ 审批历史中有记录?
│ ├─ 是 → 使用历史记录的状态
│ └─ 否 → 返回 null
│
└─ 返回最终状态
修改后:
// ⭐ 直接保存 data 字段(不使用 JSON 序列化)
this.project.set('data', data);
console.log('💾 [提交订单] 准备保存项目数据:', {
projectId: this.project.id,
currentStage: this.project.get('currentStage'),
approvalStatus: data.approvalStatus,
approvalHistory: data.approvalHistory.length + '条记录'
});
await this.project.save();
console.log('✅ [提交订单] 项目保存成功,验证数据:', {
approvalStatus: this.project.get('data')?.approvalStatus,
currentStage: this.project.get('currentStage')
});
1. 组长在组长看板
└─> 点击"通过审批"
└─> approveOrder() 执行
├─> data.approvalStatus = 'approved'
├─> this.project.set('data', data) ← ⭐ 直接设置
├─> this.project.set('currentStage', '确认需求')
├─> await this.project.save() ← ⭐ 保存成功
└─> 控制台输出: "审批状态: approved, 当前阶段: 确认需求"
2. 用户刷新订单分配页面 (/order)
└─> loadData() 执行
├─> ⭐ 重新查询项目数据
├─> 获取最新的 approvalStatus 和 currentStage
└─> 控制台输出: "项目数据已刷新"
3. getApprovalStatus() 执行
└─> 读取 data.approvalStatus
├─> 情况A: 值为 'approved' → 返回 'approved' ✓
├─> 情况B: 值为空,但 currentStage = '确认需求'
│ └─> ⭐ 智能判定: 'approved' ✓
└─> 情况C: 值为空,currentStage = '订单分配'
└─> ⭐ 检查审批历史 → 'approved' ✓
4. 页面显示
└─> ✅ 显示: "审批已通过"(绿色横幅)
1. 客服/设计师提交订单
└─> submitForOrder() 执行
├─> 检测到已分配设计师
├─> data.approvalStatus = 'approved' ← 自动通过
├─> data.approvalHistory 记录自动审批
├─> this.project.set('data', data) ← ⭐ 直接设置
├─> this.project.set('currentStage', '确认需求')
├─> await this.project.save()
└─> 控制台输出保存前后状态
2. 页面刷新
└─> ✅ 显示: "审批已通过"
1. 客服/设计师提交订单
└─> submitForOrder() 执行
├─> 检测到未分配设计师
├─> data.approvalStatus = 'pending' ← 待审批
├─> data.approvalHistory 记录待审批
├─> this.project.set('currentStage', '订单分配')
├─> await this.project.save()
└─> 发送通知给组长
2. 页面显示
└─> ⏳ 显示: "等待组长审批"(正确)
3. 组长审批通过
└─> approveOrder() 执行
└─> data.approvalStatus = 'approved'
└─> currentStage = '确认需求'
└─> 保存成功
4. 再次访问订单分配页面
└─> ✅ 显示: "审批已通过"(修复后正确)
approveOrder() 方法| 改动 | 修改前 | 修改后 |
|---|---|---|
| 数据保存 | JSON.parse(JSON.stringify(data)) |
直接 data |
| 字段清理 | 只删除 lastRejectionReason |
同时删除 pendingApprovalBy |
| 标记更新 | 无 | 添加 pendingApproval = false |
| 日志输出 | 简单 | 保存前后都输出状态 |
loadData() 方法| 改动 | 修改前 | 修改后 |
|---|---|---|
| 数据刷新 | 只在 !this.project 时查询 |
即使已存在也重新查询 |
| 刷新逻辑 | 无 | 使用 Parse.Query 重新获取 |
| 日志输出 | 无 | 刷新前后都输出状态 |
| 容错处理 | 无 | 添加 try-catch |
getApprovalStatus() 方法| 改动 | 修改前 | 修改后 |
|---|---|---|
| 判定逻辑 | 直接返回 data.approvalStatus |
三级智能判定 |
| 日志输出 | 简单 | 详细输出所有判定条件 |
| 视图更新 | 有 | 优化并添加日志 |
function getApprovalStatus() {
// 第1步:读取 data.approvalStatus
let status = data.approvalStatus || null;
// 第2步:如果为空且项目已推进,自动判定为已通过
if (!status && currentStage !== '订单分配') {
status = 'approved';
// 理由:项目已经在后续阶段,说明订单分配肯定通过了
}
// 第3步:如果为空且仍在订单分配阶段,检查审批历史
if (!status && currentStage === '订单分配' && approvalHistory.length > 0) {
const latest = approvalHistory[approvalHistory.length - 1];
status = latest.status; // 'approved' | 'rejected' | 'pending'
}
return status;
}
判定优先级:
data.approvalStatus 明确值currentStage 推断(已推进则必定通过)approvalHistory 历史记录| 文件 | 修改点 | 说明 |
|---|---|---|
stage-order.component.ts |
approveOrder() |
优化数据保存方式 + 日志 |
stage-order.component.ts |
rejectOrder() |
优化数据保存方式 + 日志 |
stage-order.component.ts |
submitForOrder() |
优化数据保存方式 + 日志 |
stage-order.component.ts |
loadData() |
添加强制数据刷新逻辑 |
stage-order.component.ts |
getApprovalStatus() |
三级智能判定 + 详细日志 |
总计修改点:5处关键方法,15+处代码改动
操作步骤:
/order预期结果:
控制台输出:
🔄 重新查询项目数据,确保获取最新审批状态...
✅ 项目数据已刷新 { approvalStatus: 'approved', currentStage: '确认需求' }
🔍 [智能判定] 项目已推进到 "确认需求" 阶段,订单分配审批必定已通过
✅ 订单分配审批已通过
页面显示:
✅ 审批已通过
订单已获组长批准,项目进入下一阶段
操作步骤:
currentStage = '交付执行'data.approvalStatus = null(缺失)预期结果:
控制台输出:
🔍 [智能判定] 项目已推进到 "交付执行" 阶段,订单分配审批必定已通过
✅ 订单分配审批已通过
页面显示:
✅ 审批已通过
操作步骤:
currentStage = '订单分配'data.approvalStatus = null(缺失)data.approvalHistory[0].status = 'approved'预期结果:
控制台输出:
🔍 [智能判定] 审批历史显示已通过,但 approvalStatus 字段缺失,自动判定为 approved
✅ 订单分配审批已通过
页面显示:
✅ 审批已通过
🔄 重新查询项目数据,确保获取最新审批状态...
✅ 项目数据已刷新 {
approvalStatus: 'approved',
currentStage: '确认需求'
}
🔍 [loadData] 项目审批状态详情: {
项目ID: 'iKvYck89zE',
当前阶段: '确认需求',
审批状态: 'approved',
是否pending: false,
是否approved: true,
是否rejected: false,
审批历史: [
{
stage: '订单分配',
status: 'approved',
submitter: '张三',
approver: '李组长',
submitTime: '2025-11-11T08:00:00Z',
approvalTime: '2025-11-11T08:30:00Z'
}
],
pendingApprovalBy: undefined,
submittedPending按钮状态: false
}
🔍 【审批状态检查】 {
原始审批状态: 'approved',
最终判定状态: 'approved',
是否approved: true,
当前阶段: '确认需求',
项目ID: 'iKvYck89zE'
}
✅ 订单分配审批已通过
┌─────────────────────────────────────────┐
│ ⏳ 等待组长审批 │
│ 订单已提交,正在等待组长审核批准 │
└─────────────────────────────────────────┘
↑ 错误显示(实际已通过)
┌─────────────────────────────────────────┐
│ ✅ 审批已通过 │
│ 订单已获组长批准,项目进入下一阶段 │
└─────────────────────────────────────────┘
↑ 正确显示(实时同步)
<div class="approval-status-banner approved">
<div class="status-content">
<h4>审批已通过</h4>
<p>审批人:{{ getApprover() }}</p>
<p>审批时间:{{ getApprovalTime() | date }}</p>
</div>
</div>
<button class="btn-refresh" (click)="refreshProjectData()">
🔄 刷新状态
</button>
// 实时监听项目数据变化
const subscription = await query.subscribe();
subscription.on('update', (updatedProject) => {
this.project = updatedProject;
this.cdr.markForCheck();
});
更新日期: 2025-11-11
维护人员: 开发团队
修复版本: v2.0(完整版)