问题
核准 / 拒绝时可在「审批意见」弹窗上传附件(拖拽区)。附件本应在记录详情 / 审批中心的「审批动态」时间线里,对应那条决策记录下方以 `📎 文件名` 胶囊呈现,点击在新标签页打开。实际表现:
- 胶囊只显示通用词「附件」,看不到真实文件名。
- 点击胶囊无任何反应,也没有任何报错提示。
根因(前端,已读码确认)
apps/console/src/pages/system/ApprovalsInboxPage.tsx:
- 文件名来自
GET /api/v1/data/sys_file/{id} 的 record.name(约 L441);该请求失败 / 返回空即静默回退成「附件」(L833)。sys_file 是系统对象,普通审批人一般无直接读权限 → 拿不到名字。
- 点击走
openAttachment(L454):请求 GET /api/v1/storage/files/{id}/url 拿签名链接后 window.open;任何失败都被 catch {} 无声吞掉(L462),零反馈,表现即「点了没反应」。
待复现确认(后端 / objectstack repo)
/storage/files/{id}/url 对 scope==='attachments' 的文件走 authorizeDownload → authorizeFileRead;若审批决策上传的附件未正确挂到审批人可读的记录、或 scope 不符,将返回 403 → 被前端吞掉。需在 showcase 真机复现,确认是权限(403)还是文件缺失(404),据此决定 framework 侧改动。
方案
- 前端:点击失败给用户可见反馈(toast / 提示);文件名解析改用审批人可授权的来源,不再依赖对
sys_file 的原始 data 读。
- 后端(若复现确认):让审批附件的下载授权 / 名称读取对审批人可用。
- 交付前用 framework
app-showcase 的「审批 + 存储」链路真机 UI 实测通过。
关联 framework: objectstack-ai/objectstack(后端授权部分,复现确认后开配套 issue)。
问题
核准 / 拒绝时可在「审批意见」弹窗上传附件(拖拽区)。附件本应在记录详情 / 审批中心的「审批动态」时间线里,对应那条决策记录下方以 `📎 文件名` 胶囊呈现,点击在新标签页打开。实际表现:
根因(前端,已读码确认)
apps/console/src/pages/system/ApprovalsInboxPage.tsx:GET /api/v1/data/sys_file/{id}的record.name(约 L441);该请求失败 / 返回空即静默回退成「附件」(L833)。sys_file是系统对象,普通审批人一般无直接读权限 → 拿不到名字。openAttachment(L454):请求GET /api/v1/storage/files/{id}/url拿签名链接后window.open;任何失败都被catch {}无声吞掉(L462),零反馈,表现即「点了没反应」。待复现确认(后端 / objectstack repo)
/storage/files/{id}/url对scope==='attachments'的文件走authorizeDownload → authorizeFileRead;若审批决策上传的附件未正确挂到审批人可读的记录、或 scope 不符,将返回 403 → 被前端吞掉。需在 showcase 真机复现,确认是权限(403)还是文件缺失(404),据此决定 framework 侧改动。方案
sys_file的原始 data 读。app-showcase的「审批 + 存储」链路真机 UI 实测通过。关联 framework: objectstack-ai/objectstack(后端授权部分,复现确认后开配套 issue)。