结论
未受管项目、档口、日期和餐次完全执行原逻辑;受管范围只增加写保护。查询、点餐、消费机、移动端、菜品管理和食物成分管理保持不变。
受管范围
store_id + restaurant_id + menu_date + meal_times
存在启用计划且当前或发布版本含该餐次 → 旧写入口拒绝
未匹配 → 原逻辑继续执行
旧写入口
| 入口 | 处理 |
|---|---|
| PC旧菜谱保存、复制、限量 | 业务服务写前调用统一守卫 |
| 批量排菜和Excel提交 | 校验全部目标范围,任一受管则整批拒绝 |
| 设备增加、删除、复制菜谱 | 写前校验,受管则不产生数据变化 |
| 其他写recipes的服务或定时任务 | 上线前扫描,接入守卫或证明只读 |
统一守卫
SchoolNutritionScopeGuard 位于业务服务层。受管时返回 SCHOOL_NUTRITION_SCOPE_MANAGED;查询失败时失败关闭,不默认放行。
发布事务
- 锁计划与待审核版本。
- 校验权限、内容和核验状态。
- 生成快照。
- 锁并替换目标范围
ydy_recipes。 - 回读一致性。
- 更新发布指针、需求状态和日志。
- 提交;失败整体回滚。
设备推送等外部副作用在事务提交后执行,失败记录并重试。
验收重点
- 无计划时旧逻辑行为完全一致。
- 受管时所有旧写入口均拒绝。
- 不同商户、档口、日期和餐次不误拦截。
- 发布快照、原表及三端读取一致。
- 发布失败原菜单不变,重复发布不产生重复行。