Fix/同一张图片复制粘贴再重进画布副本会消失 #131

Closed
k88936 wants to merge 7 commits from fix/copy-pasted-on-canva into master
Member

原因: 画布复制逻辑曾为副本生成 local-resource-copy-*,但没有创建对应项目资源;自动保存虽然触发,结构化画布会拒绝缺资源引用,legacy 快照刷新时也无法 hydrate 副本。

(layout描述在哪, resource 描述画什么)
解决方法:
让新的副本(a layout)引用同一个resourceId, 并在原layout的引用未准备好时禁用对它的复制(简化了逻辑)

before:
image.png
after:
shotmd-1785754592-compressed.webp

原因: 画布复制逻辑曾为副本生成 `local-resource-copy-*`,但没有创建对应项目资源;自动保存虽然触发,结构化画布会拒绝缺资源引用,legacy 快照刷新时也无法 hydrate 副本。 (layout描述在哪, resource 描述画什么) 解决方法: 让新的副本(a layout)引用同一个resourceId, 并在原layout的引用未准备好时禁用对它的复制(简化了逻辑) before: ![image.png](/attachments/a52891a7-246c-4934-96fe-1c4de1b9b5c4) after: ![shotmd-1785754592-compressed.webp](/attachments/88031485-f362-4c7e-8f24-ecba6103dbe0)
k88936 added 4 commits 2026-08-03 19:10:18 +08:00
复制粘贴和创建副本改为复用原项目资源
补齐临时资源共享回填与缓存去重
新增副本保存重进和结构化布局回归测试
同步画布持久化文档与项目决策记录
禁止复制、剪切或创建仍使用临时资源 ID 的图层

移除临时资源创建请求的 single-flight 合并与共享回填逻辑

补充菜单禁用、快捷键反馈、资源回填恢复和持久化回归测试

同步图片画布技术方案、决策记录与排障经验
Merge remote-tracking branch 'origin/master' into fix/copy-pasted-on-canva
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / Frontend tests (pull_request) Successful in 4m2s
Project CI / Native shell tests (pull_request) Successful in 12m34s
cb89ae6d99
# Conflicts:
#	docs/project-memory/shared-memory/decision-log.md
k88936 added this to the 美术画布 project 2026-08-03 19:10:52 +08:00
k88936 added 1 commit 2026-08-03 19:11:04 +08:00
Merge branch 'master' into fix/copy-pasted-on-canva
Project CI / Repository checks (pull_request) Successful in 59s
Project CI / Frontend tests (pull_request) Successful in 3m29s
Project CI / Backend tests (pull_request) Successful in 3m56s
Project CI / Native shell tests (pull_request) Successful in 12m46s
01b1d945c3
k88936 marked the pull request as ready for review 2026-08-04 12:19:37 +08:00
kdletters requested review from kdletters 2026-08-04 17:41:11 +08:00
kdletters requested changes 2026-08-04 17:42:06 +08:00
kdletters left a comment
Member

把所有 local-* 都误判成“素材仍在保存”

ImageCanvasLayerCommandModel.ts:52 会永久禁止复制所有 local-* 图层。但仓库明确支持无资源行的历史角色动作序列,前端也会从持久化帧直接恢复;这些图层不会再回填正式 ID。结果是复制、剪切、创建副本永久禁用,快捷键却一直提示“请稍后重试”。
应依据真实在途登记状态判断,或先迁移/单独处理合法历史序列,不能只看 ID 前缀。

更准确地说:不是“永远不可能迁移”,而是正常的打开、保存链路不会自动回填正式 ID;只有显式修复或迁移流程才可能改变它。
这类历史角色动作是一个兼容例外:
后端允许它没有 editor_project_resource 资源行,只要布局自身保存了完整图片序列帧。
前端打开项目时,hydrateLayer 直接用第一帧恢复图层,不要求找到资源行。
加载项目只是直接设置这些图层;createProjectResourceForLayer 只会处理新追加到画布的本地图层,不会扫描并补登记已加载的历史图层。
因此它虽然叫 local-,实际上已经是持久化终态,并不存在一个等待中的请求会返回正式 ID。
所以 local-
当前有两种含义:
新增素材正在登记,稍后会回填正式 ID。
历史角色动作兼容数据,正常使用中永远保持本地 ID。
PR 把两者统一解释成第一种,才会产生永久显示“素材仍在保存”的问题。即使产品决定不支持复制第二种,也应明确提示“历史素材暂不支持复制”,或者先迁移成正式资源,而不是让用户无限等待。

# 把所有 local-* 都误判成“素材仍在保存” ImageCanvasLayerCommandModel.ts:52 会永久禁止复制所有 local-* 图层。但仓库明确支持无资源行的历史角色动作序列,前端也会从持久化帧直接恢复;这些图层不会再回填正式 ID。结果是复制、剪切、创建副本永久禁用,快捷键却一直提示“请稍后重试”。 应依据真实在途登记状态判断,或先迁移/单独处理合法历史序列,不能只看 ID 前缀。 更准确地说:不是“永远不可能迁移”,而是正常的打开、保存链路不会自动回填正式 ID;只有显式修复或迁移流程才可能改变它。 这类历史角色动作是一个兼容例外: 后端允许它没有 editor_project_resource 资源行,只要布局自身保存了完整图片序列帧。 前端打开项目时,hydrateLayer 直接用第一帧恢复图层,不要求找到资源行。 加载项目只是直接设置这些图层;createProjectResourceForLayer 只会处理新追加到画布的本地图层,不会扫描并补登记已加载的历史图层。 因此它虽然叫 local-*,实际上已经是持久化终态,并不存在一个等待中的请求会返回正式 ID。 所以 local-* 当前有两种含义: 新增素材正在登记,稍后会回填正式 ID。 历史角色动作兼容数据,正常使用中永远保持本地 ID。 PR 把两者统一解释成第一种,才会产生永久显示“素材仍在保存”的问题。即使产品决定不支持复制第二种,也应明确提示“历史素材暂不支持复制”,或者先迁移成正式资源,而不是让用户无限等待。
k88936 marked the pull request as work in progress 2026-08-04 19:24:12 +08:00
k88936 added 1 commit 2026-08-06 17:28:46 +08:00
合并主分支并解决画布复制冲突
Project CI / Repository checks (pull_request) Successful in 52s
Project CI / Backend tests (pull_request) Failing after 1m42s
Project CI / Frontend tests (pull_request) Successful in 2m58s
Project CI / Native shell tests (pull_request) Has been cancelled
df7c27aa64
同步主分支的编辑器、运行时、后端与运维改动
保留画布副本复用项目资源和结构化持久化行为
采用显式资源持久化状态与图层素材类型覆盖合同
补齐相关测试、技术文档与共享项目记忆
Author
Member

把所有 local-* 都误判成“素材仍在保存”

ImageCanvasLayerCommandModel.ts:52 会永久禁止复制所有 local-* 图层。但仓库明确支持无资源行的历史角色动作序列,前端也会从持久化帧直接恢复;这些图层不会再回填正式 ID。结果是复制、剪切、创建副本永久禁用,快捷键却一直提示“请稍后重试”。
...
加载项目只是直接设置这些图层;createProjectResourceForLayer 只会处理新追加到画布的本
PR 把两者统一解释成第一种,才会产生永久显示“素材仍在保存”的问题。即使产品决定不支持复制第二种,也应明确提示“历史素材暂不支持复制”,或者先迁移成正式资源,而不是让用户无限等待。

这个在已合并的 #117 里解决了, 现在 local-* 明确都是临时图层

> # 把所有 local-* 都误判成“素材仍在保存” > ImageCanvasLayerCommandModel.ts:52 会永久禁止复制所有 local-* 图层。但仓库明确支持无资源行的历史角色动作序列,前端也会从持久化帧直接恢复;这些图层不会再回填正式 ID。结果是复制、剪切、创建副本永久禁用,快捷键却一直提示“请稍后重试”。 > ... > 加载项目只是直接设置这些图层;createProjectResourceForLayer 只会处理新追加到画布的本 > PR 把两者统一解释成第一种,才会产生永久显示“素材仍在保存”的问题。即使产品决定不支持复制第二种,也应明确提示“历史素材暂不支持复制”,或者先迁移成正式资源,而不是让用户无限等待。 这个在已合并的 #117 里解决了, 现在 local-* 明确都是临时图层
k88936 marked the pull request as ready for review 2026-08-06 17:31:49 +08:00
k88936 added 1 commit 2026-08-06 17:40:52 +08:00
移除合并后的重复画布测试
Project CI / Repository checks (pull_request) Successful in 55s
Project CI / Backend tests (pull_request) Successful in 3m50s
Project CI / Frontend tests (pull_request) Successful in 3m10s
Project CI / Native shell tests (pull_request) Successful in 14m40s
bac8111d99
保留主分支扩展后的共享资源布局测试
删除被完整覆盖的旧版同名测试定义
恢复 spacetime-module 测试编译与执行
Member

关闭原因:

  • 当前 PR head bac8111d99 与 merge-base a03f13d0a5 的 tree 完全一致,三点 diff 为空。
  • 相关画布副本持久化、资源登记状态区分及双层 assetKind 修复已由提交 7f18f7ce04 进入 master,当前 master 已包含最终实现。
  • 当前 head 的 Repository checks、Frontend tests、Backend tests、Native shell tests 均已通过。
  • merge-tree 与当前 master tree 一致;继续合并不会带来代码变化,只会把冗余分支提交和主线 merge 写入历史。

因此按“修复已由 master 吸收,PR 无剩余净差异”关闭,不会丢失尚未合并的代码。

关闭原因: - 当前 PR head bac8111d99a41a8949df112140d2f9cc200b6434 与 merge-base a03f13d0a5f9234dd63f1dd3a4207fb8f34b9ba2 的 tree 完全一致,三点 diff 为空。 - 相关画布副本持久化、资源登记状态区分及双层 assetKind 修复已由提交 7f18f7ce04b5f11b4bc6334b6c2fd6909faf390a 进入 master,当前 master 已包含最终实现。 - 当前 head 的 Repository checks、Frontend tests、Backend tests、Native shell tests 均已通过。 - merge-tree 与当前 master tree 一致;继续合并不会带来代码变化,只会把冗余分支提交和主线 merge 写入历史。 因此按“修复已由 master 吸收,PR 无剩余净差异”关闭,不会丢失尚未合并的代码。
kdletters closed this pull request 2026-08-06 18:08:26 +08:00
k88936 deleted branch fix/copy-pasted-on-canva 2026-08-06 18:41:56 +08:00
Author
Member

666

666
Some checks are pending
Project CI / Repository checks (pull_request) Successful in 55s
Project CI / Backend tests (pull_request) Successful in 3m50s
Project CI / Frontend tests (pull_request) Successful in 3m10s
Project CI / Native shell tests (pull_request) Successful in 14m40s

Pull request closed

Sign in to join this conversation.