Files
shanxia2.0/docs/development/child-data-save-rules.md
T

3.9 KiB

子数据保存规则(强制)

适用于后端、Web 管理端、Web 移动 H5 和小程序。修改保存、批量更新、导入更新、复制、子数据移除及流程配置前,必须完整阅读本文件。

  • 禁止全删全增:编辑、保存、批量更新或导入更新已有主单时,SHALL NOT 先将该主单的全部子数据物理删除或统一设置 del_flag=1,再将请求中的子数据全部重新插入。不得通过前端先调用删除接口再批量新增、ORM 集合清空/替换或删除后重新生成 UUID 绕过此规则。全量提交列表不等于全量重建记录。
  • 差量处理:编辑已有主单时,SHALL 在当前租户、当前主单的有效子行上按下列规则处理。请求里带了本主单、本租户的有效 id:就地修改,保留原 id、创建人和创建时间。没带 id:生成新 id 插入。本次明确不再提交的旧行:软删除(del_flag=1)。不得把产品、人员等主数据 ID 当作明细 ID。
  • 业务键复用(仅供参考):不是每个子表都有稳定业务键,无业务键的子表 SHALL 按上一条处理,不得按名称或其它字段猜配旧行。只有该子表自己定义了稳定业务键时,才可额外约定:没带 id,且该业务键在未被占用的旧行里只命中一条,则复用那一行、不新建。产品品牌、别名以名称作为这类业务键。命中多条时保存前失败,不改任何行。纯关联表若没有明细 id、只有关联组合,仍按该组合比较集合。
  • 身份与历史字段:更新 SHALL 保留原明细 ID、创建人和创建时间,以及本次未提交的业务字段(如实际数量、交付状态、归档金额、回传和附件信息)。关系不变时 SHALL 保留关系记录 ID。编辑载入、提交、保存后继续编辑均须保留服务端明细 ID;复制为新单时须清除原单及各层子明细 ID,并重新建立新单内部关联。此要求同时适用于 Web、移动 H5 和小程序。
  • 遗漏与清空不同:请求里根本没传这个子集合时,原集合保持不变;显式 [] 才表示申请清空,并仍须通过删除校验。字段未提交与显式清空也 SHALL 分别处理,禁止用 schema 默认值或 items or [] 将遗漏误当清空。
  • 校验先于修改:SHALL 在写入前校验明细 ID 的存在性、有效状态、当前租户/主单归属及重复提交。重复 id、别人的 id、已删除 id 保存前直接失败,不改任何行,不得静默当新增。
  • 删除引用保护:移除或改变被引用明细的业务身份前,SHALL 检查运输、库存、回传、归档、审批等下游有效引用;存在引用时应拒绝或走已定义的业务撤销流程。不得让有效数据指向已删除明细,不得借普通保存自动重绑或清理历史异常。在途审批引用的流程节点不得因配置保存而被重建或破坏。
  • 事务与回归:主单、子单及关联变更 SHALL 在同一事务完成,禁止先提交主单再保存子单。相关修改 SHALL 覆盖无变更保存 ID 不变、修改/新增/移除、遗漏/空集合、重复/跨租户/跨主单 ID 拒绝、下游引用保护,以及各客户端编辑/复制 ID 往返的回归测试。
  • 适用边界:明确删除主单时的受控级联软删除、追加新的审批轮次/业务版本不是编辑既有子记录;这些操作仍须保留历史并校验引用。不得将普通保存命名为“重建”“同步”或“重新安排”来规避上述规则。审查时 SHALL 跟踪调用链确认业务语义,不能只凭函数名称判定。
  • 已确认的业务例外:无装货段计划在显式调整运输时,作废旧出入库单并生成新单及现场链接,是用户确认保留的业务流程。此例外仅适用于该出入库单作废重开流程,不适用于归档库存流水、地磅关联或其他明细的普通保存。