从客服板块 (customer-service/project-list) 进入确认需求阶段时,看不到"确认需求"按钮。
组件渲染方式:
project-detail.component 使用 <router-outlet> 来渲染子组件(包括 stage-requirements)@Input() 属性权限检查逻辑问题:
stage-requirements.component.ts 中的 canEdit 默认值是 truengOnInit() 中会尝试获取当前用户并根据角色重新计算 canEditcalculatedCanEdit 会被设置为 falsecanEdit,导致默认值 true 被覆盖为 falseconst role = this.currentUser?.get?.('roleName') || '';
const calculatedCanEdit = ['客服', '组员', '组长', '管理员', '设计师', '客服主管'].includes(role);
// 🔥 问题:无论role是否有效,都会覆盖canEdit
this.canEdit = calculatedCanEdit; // ❌ 当role为空时,这里会设置为false
问题场景:
currentUser 可能还未初始化role 为空字符串 ''calculatedCanEdit = false(因为空字符串不在允许列表中)canEdit 被覆盖为 false核心思路:只有当成功获取到用户且角色有效时,才覆盖 canEdit;否则保留默认值。
// 若无当前用户,从企业微信获取并计算权限
try {
if (!this.currentUser && this.cid) {
const wx = new WxworkAuth({ cid: this.cid, appId: 'crm' });
this.currentUser = await wx.currentProfile();
}
const role = this.currentUser?.get?.('roleName') || '';
console.log('🔍 确认需求阶段权限检查:', {
'当前用户': this.currentUser?.get?.('name') || 'Unknown',
'用户角色': role,
'有currentUser': !!this.currentUser,
'原始canEdit': this.canEdit,
'cid': this.cid,
'projectId': this.projectId
});
// 🔥 关键修复:只有当成功获取到用户且角色有效时,才覆盖canEdit
if (this.currentUser && role) {
const calculatedCanEdit = ['客服', '组员', '组长', '管理员', '设计师', '客服主管'].includes(role);
this.canEdit = calculatedCanEdit;
console.log('✅ 根据角色计算canEdit:', calculatedCanEdit, '角色:', role);
} else {
// 如果没有用户信息或角色为空,保留默认值true
console.log('⚠️ 未获取到用户角色,保留默认canEdit:', this.canEdit);
}
console.log('✅ 最终canEdit值:', this.canEdit);
} catch (e) {
console.error('❌ 权限检查失败,保留默认canEdit:', this.canEdit, e);
}
条件检查:
if (this.currentUser && role) {
// 只有在这两个条件都满足时,才计算并覆盖canEdit
}
保留默认值:
currentUser 不存在,保留默认值 truerole 为空,保留默认值 true详细日志:
用户从客服板块进入 → currentUser未初始化 → role为空 →
calculatedCanEdit = false → canEdit被覆盖为false →
按钮隐藏 ❌
用户从客服板块进入 → currentUser未初始化 → role为空 →
检测到role为空 → 保留默认canEdit = true →
按钮显示 ✅
| 场景 | 修复前 | 修复后 |
|---|---|---|
| 用户已登录且有角色 | ✅ 按钮显示(如果角色在允许列表) | ✅ 按钮显示(如果角色在允许列表) |
| 用户已登录但角色为空 | ❌ 按钮隐藏(canEdit被设为false) | ✅ 按钮显示(保留默认true) |
| 用户未登录 | ❌ 按钮隐藏(canEdit被设为false) | ✅ 按钮显示(保留默认true) |
| 用户角色不在允许列表 | ❌ 按钮隐藏(canEdit被设为false) | ❌ 按钮隐藏(正确行为) |
🔍 确认需求阶段权限检查: {
当前用户: "张三",
用户角色: "客服",
有currentUser: true,
原始canEdit: true,
cid: "cDL6R1hgSi",
projectId: "B1ndTeOGpP"
}
✅ 根据角色计算canEdit: true 角色: 客服
✅ 最终canEdit值: true
🔍 确认需求阶段权限检查: {
当前用户: "Unknown",
用户角色: "",
有currentUser: false,
原始canEdit: true,
cid: "cDL6R1hgSi",
projectId: "B1ndTeOGpP"
}
⚠️ 未获取到用户角色,保留默认canEdit: true
✅ 最终canEdit值: true
1. 访问客服板块:http://localhost:4200/customer-service/project-list
2. 点击"确认需求"列中的项目"进入"按钮
3. 进入确认需求阶段页面
4. 打开浏览器控制台查看日志
5. 预期:
- 看到"🔍 确认需求阶段权限检查"日志
- 看到"✅ 最终canEdit值: true"
- 页面底部显示"保存草稿"和"确认需求"按钮 ✅
1. 确保已登录且角色为"客服"
2. 访问:http://localhost:4200/wxwork/cDL6R1hgSi/project/xxx/requirements
3. 预期:
- 控制台显示"根据角色计算canEdit: true 角色: 客服"
- 页面显示"确认需求"按钮 ✅
1. 使用非允许角色账号登录(如"财务")
2. 访问确认需求阶段
3. 预期:
- 控制台显示"根据角色计算canEdit: false 角色: 财务"
- 页面不显示"确认需求"按钮 ✅(正确行为)
yss-project/src/modules/project/pages/project-detail/stages/stage-requirements.component.ts
ngOnInit() 中的权限检查逻辑canEdityss-project/src/modules/project/pages/project-detail/stages/stage-requirements.component.html
@if (canEdit) 控制按钮显示yss-project/src/modules/project/pages/project-detail/project-detail.component.ts
canEdit 但通过路由无法传递给子组件问题:组长端进入交付执行阶段时,即使项目未提交审批也会显示审批按钮。
要求:只有项目提交了审批(deliveryApprovalStatus === 'pending')后,组长才能看到审批按钮。
修复:
修改了 stage-delivery.component.ts 中的 shouldShowApprovalButtons() 方法:
shouldShowApprovalButtons(): boolean {
if (!this.project) return false;
// 🔥 关键:只有在pending状态时才显示审批按钮
const status = this.getDeliveryApprovalStatus();
if (status !== 'pending') {
console.log('🔍 项目未处于待审批状态,隐藏审批按钮', { status });
return false;
}
// 组长从组长看板进入且项目处于待审批状态时,显示审批按钮
console.log('🔍 项目处于待审批状态,显示审批按钮');
return true;
}
效果:
canEdit 设为 falsecanEdit,否则保留默认值 truedeliveryApprovalStatus === 'pending' 时才显示审批按钮🎉 修复完成! 现在客服板块可以正常看到确认需求按钮,组长端的审批按钮也只在正确的时机显示!