Skip to content

[finding] 删除记录后,它的审批单仍留在审批收件箱:pending 与 approved 两种都留,记录引用退化为原始 id #13568

Description

@yinlianghui

来源:宣传视频车道 #147(一句话新模块·请假管理)录制整备时发现。未改动任何平台代码,本单为只读观察 + 一次真实业务流程实跑。

本单只描述现象,不预设修正方向。 是否算缺陷、以及该往哪个方向处理(保留审计痕迹的软引用、连带清理、有在途审批时禁止删除、仅改界面呈现……)全部留给负责人裁定。故不带 pm:queue——请先分级,不要被自动流程当成待开发任务直接领走。

现象

一个用「审批流 + 按状态共享」搭起来的请假模块:员工提交请假 → 主管在审批收件箱批准。

删除一条请假记录后,它此前产生的审批单仍留在审批收件箱里,并且:

  • pending 的会留:记录被删时那条待批审批单仍在收件箱,仍为待批状态,仍可被点开;
  • approved 的也会留:已批准过的记录被删后,它的审批单同样留在列表里;
  • 记录引用退化:行内本该显示记录标识的位置不再显示业务编号(如 LR-00006),退化为原始记录 id(观察到的那条为 9SEmly…-J7Z)。审批单指向的记录此时已不存在。

是怎么撞上的

不是刻意构造的,是正常操作里绕不开的一步:

  1. 建了一条请假记录,触发审批,收件箱出现待批项;
  2. 需要改这条记录的日期,但因该模块声明了 lockRecord: true,在途审批把记录锁住,改不了(RECORD_LOCKED);
  3. 于是删掉重建——这是被锁之后唯一可走的路;
  4. 记录没了,它的审批单留在了收件箱里。

也就是说:lockRecord 把「改不了就删了重建」变成常规操作,而删除又会留下审批单,两件事叠在一起,普通搭建流程里就会持续积累这类指向不存在记录的行。

影响面

不限于请假:任何「审批 + lockRecord」的组合都走同一条路。收件箱是审批人每天看的界面,留下的行会计入待批数量,点开后指向的记录已不存在。

邻近既有单(已查,均非重复)

复现最小路径

  1. 建一个对象,声明 type:'approval' 节点 + approvalStatusField + lockRecord: true
  2. 以普通用户提交一条记录 → 审批收件箱出现待批项;
  3. 不批准,直接删除该记录;
  4. 打开审批收件箱 → 那条待批项仍在,记录标识处显示原始 id;
  5. 换一条已批准的记录重复第 3 步 → 其审批单同样留在列表里。

取证环境

2026-08-31,载体 objectstack-ai/hotcrm,钉 @objectstack/* 17.1.0。观察发生在 #147 录制整备的干跑中,收件箱当时共两行,其中一行即上述孤儿审批单。未做进一步代码级取证——本单停在现象层,按上面的说明留待分级。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions