{
  "version": "0.5",
  "scenes": [
    [
      "online_dine",
      "线上点餐",
      "堂食订单打印"
    ],
    [
      "online_pickup",
      "线上点餐",
      "自提订单打印"
    ],
    [
      "online_locker",
      "线上点餐",
      "取餐柜订单打印"
    ],
    [
      "offline_menu",
      "线下消费",
      "菜单消费打印"
    ],
    [
      "offline_fixed",
      "线下消费",
      "定额消费打印"
    ],
    [
      "offline_custom",
      "线下消费",
      "自定义消费打印"
    ],
    [
      "manual",
      "补打策略",
      "人工补打"
    ],
    [
      "auto",
      "补打策略",
      "失败自动补打"
    ]
  ],
  "useCases": [
    {
      "id": "UC-STALL-PRINT-SWITCH-001",
      "name": "维护档口的分场景打印策略",
      "actor": "具备目标档口打印策略修改权限的管理员/商家",
      "trigger": "需要保留线上打印，关闭线下菜单消费打印，或调整其他独立开关",
      "pre": [
        "已登录，账号有效，拥有目标档口查看及打印策略修改权限。",
        "已选择有效授权档口并读取档口策略版本；绑定打印机为只读执行上下文，不是策略主键。未关联可维护策略，但不得实际投递；多关联沿用原系统阻断。",
        "已有配置及版本成功读取；只展示该档口已启用且能可靠分类的消费场景。",
        "原业务模板、张数及订单规则保留；演练中的初始开关仅为样例，不充当正式迁移默认值。"
      ],
      "success": [
        "仅本次修改的场景/补打开关持久化，新版本和最后修改人/时间可读。",
        "配置和成功操作审计一致提交；另一端重新读取/刷新后值一致。",
        "尚未提交的打印按有效策略重新判定；已受理任务不声称可撤回。"
      ],
      "failure": [
        "旧有效配置仍生效；未保存草稿不影响实际打印。",
        "错误留在表单内，保留草稿并给出重试或刷新入口；无成功提示。",
        "越权、失效档口不修改数据；审计失败不提交配置。"
      ],
      "main": [
        [
          "M1",
          "餐厅管理→餐厅设置→档口设置，按所属餐厅和档口名称搜索",
          "P01",
          "保留现有档口名称、所属餐厅、四餐营业时间、负责人、位置、状态、编辑操作",
          "loaded",
          "AC01"
        ],
        [
          "M2",
          "点目标档口“编辑”，进入原有编辑档口整页，在原表单后查看新增“打印设置”分组",
          "P02",
          "以档口ID加载策略/版本/修改人；已关联打印机只读展示，设备绑定/模板/张数仍在设备管理维护",
          "loaded",
          "AC02"
        ],
        [
          "M3",
          "将“线下消费→菜单消费打印”关闭，其余开关保持",
          "P02",
          "蓝色开关变灰且文字“已关闭”；“有未保存修改”出现，底部保存可用",
          "dirty",
          "AC03"
        ],
        [
          "M4",
          "点击“保存”，表单进入保存中",
          "P02",
          "保存按钮显示“保存中…”，开关/取消临时禁用，阻止重复请求",
          "saving",
          "AC04"
        ],
        [
          "M5",
          "保存成功",
          "P02",
          "绿色就地提示“已保存”，显示新版本；追加含前后值的成功操作日志",
          "saved",
          "AC05"
        ],
        [
          "M6",
          "从商家移动端 我的→档口设置→目标授权档口→打印设置，点击刷新",
          "M02",
          "移动端显示同一档口的菜单消费已关闭，线上各项值保持；日志可追溯",
          "synced",
          "AC06"
        ]
      ],
      "alt": [
        [
          "A1@M3",
          "需要恢复打印",
          "开启对应场景并保存；只恢复后续合法打印，不集中补打历史抑制订单",
          "P02/M02",
          "saved",
          "AC07"
        ],
        [
          "A2@M3",
          "编辑后点取消/关闭/返回",
          "弹出“存在未保存修改，是否放弃？”；继续编辑返回草稿，放弃丢弃草稿不落库",
          "P02/M02",
          "discard-confirm",
          "AC08"
        ],
        [
          "A3@M2",
          "只读角色查看",
          "展示当前值、明确“无修改权限”；所有开关和保存禁用，日志仍按权限可查",
          "P02/M02",
          "readonly",
          "AC09"
        ],
        [
          "A4@M2",
          "同一档口更换打印机",
          "档口策略及版本保持；仅执行设备改变，日志保留历史目标",
          "P02/P03",
          "binding-replaced",
          "AC49"
        ],
        [
          "A5@M2",
          "打印机改绑另一档口",
          "读取新档口策略，不携带原档口开关；订单按自身档口重新匹配",
          "P01/P02/P03",
          "binding-moved",
          "AC50"
        ],
        [
          "A6@M2",
          "档口未关联打印机",
          "可预配置并保存档口开关；提示实际打印/补打仍因无设备而阻断",
          "P02/M02/P03",
          "unbound-configurable",
          "AC51"
        ],
        [
          "A7@M1",
          "从设备管理查看绑定档口",
          "设备页没有独立策略编辑，仅定位当前绑定档口的编辑页",
          "P08/P02",
          "stall-context",
          "AC52"
        ]
      ],
      "errors": [
        [
          "E1@M2/R1",
          "配置读取失败",
          "显示加载失败及“重新加载”，隐藏可编辑表单；恢复后重新读取",
          "P02/M02",
          "load-error",
          "AC10"
        ],
        [
          "E2@M4/R2",
          "保存失败或超时",
          "保留草稿和旧有效状态；就地红色错误、“重试保存”；超时先回读结果，不盲目重复",
          "P02/M02",
          "save-error",
          "AC11"
        ],
        [
          "E3@M4/R3",
          "其他人已修改，版本冲突",
          "提示“配置已被他人修改，请重新加载后再修改”；不覆盖新版本；确认重新加载会丢草稿",
          "P02/M02",
          "conflict",
          "AC12"
        ],
        [
          "E4@M4/R4",
          "配置审计写入失败/档口权限撤销/档口失效",
          "审计失败不保存；档口权限/状态失效拒绝并保留原值，打印机解绑不删除档口策略",
          "P02/M02",
          "audit-error/forbidden",
          "AC13"
        ]
      ]
    },
    {
      "id": "UC-STALL-PRINT-SWITCH-002",
      "name": "人工补打和失败自动补打，追踪每次请求结果",
      "actor": "有补打权限的管理员/商家；自动任务以系统身份执行",
      "trigger": "某个已支付订单需要补打，或系统处理明确失败的打印任务",
      "pre": [
        "订单属于账号授权档口，订单满足原有可打印状态，无重复支付或重建订单。",
        "按订单所属档口自动匹配唯一有效打印机；不允许随意切换到其他档口或新增多机关系。",
        "原业务场景允许打印且人工/自动对应开关开启；人工还需补打权限。",
        "目标可用；上次结果未知或已受理未结时先查询，不盲目再次投递。"
      ],
      "success": [
        "产生可追溯的补打请求及逐目标尝试，记录原因、份数、次数、操作者/系统、配置版本。",
        "云受理号与状态可查；明确区分已受理、打印成功、失败、结果待确认。",
        "订单金额、支付、模板和既有打印张数配置不被本需求改变。"
      ],
      "failure": [
        "被禁止或校验不通过时不发送打印，不增加实际投递次数；记录拒绝/跳过原因。",
        "相同请求重试复用原结果；无法判定受理结果时停在待确认。",
        "未保存补打请求日志前不对外投递，失败可定位且不得静默继续。"
      ],
      "main": [
        [
          "M1",
          "订单管理→消费订单→查看目标订单",
          "P03/M03",
          "订单详情显示所属档口、场景、唯一匹配打印机、现有份数和上次打印结果",
          "detail",
          "AC14"
        ],
        [
          "M2",
          "点击“补打小票”",
          "P04/M04",
          "弹出补打确认框/移动底部面板，打印机及份数只读；选择补打原因",
          "confirm",
          "AC15"
        ],
        [
          "M3",
          "选择“缺纸恢复/票据遗失/其他”，其他时填写说明",
          "P04/M04",
          "必填原因；缺失时表单内红字，不能提交",
          "valid/invalid",
          "AC16"
        ],
        [
          "M4",
          "点击“确认补打”",
          "P04/M04",
          "请求处理中按钮及关闭动作禁用；生成幂等请求和待提交日志，校验最新策略",
          "submitting",
          "AC17"
        ],
        [
          "M5",
          "云服务接受请求",
          "P05/M05",
          "提示“已受理，等待打印结果”；补打记录新增行，显示人工、原因、份数、尝试次数",
          "accepted",
          "AC18"
        ],
        [
          "M6",
          "回查服务结果或刷新记录",
          "P05/M05",
          "有明确结果才变为打印成功/打印失败；不能回查则显示结果待确认",
          "success/failed/unknown",
          "AC19"
        ]
      ],
      "alt": [
        [
          "A1@M2",
          "用户取消",
          "关闭确认框回订单详情，不产生补打请求",
          "P04/M04",
          "cancelled",
          "AC20"
        ],
        [
          "A2@M1",
          "发生明确失败且自动补打开启",
          "系统按原合法重试规则触发；同场景开关仍生效，日志身份显示系统",
          "P05/M05",
          "auto-attempt",
          "AC21"
        ],
        [
          "A3@M5",
          "某目标部分成功",
          "逐目标展示结果，仅重试明确未成功目标；当前标品唯一目标，不借此扩展多机绑定",
          "P05/M05",
          "partial",
          "AC22"
        ],
        [
          "A4@M1",
          "场景或人工补打开关关闭",
          "按钮禁用并显示具体关闭项；提供有配置权限者前往打印策略的入口，不绕过",
          "P03/M03",
          "blocked",
          "AC23"
        ]
      ],
      "errors": [
        [
          "E1@M3/R1",
          "原因未填/其他未说明",
          "就地红字关联字段，保留输入并聚焦错误位置",
          "P04/M04",
          "invalid",
          "AC16"
        ],
        [
          "E2@M1/R2",
          "未关联、多关联、离线、已解绑",
          "显示具体原因且禁止提交；管理员修复后刷新重新匹配",
          "P03/M03",
          "device-error",
          "AC24"
        ],
        [
          "E3@M4/R3",
          "重复点击、网络重试、人工和自动并发",
          "同一请求不新增投递；处理中返回既有请求并提示查询记录",
          "P04/P05",
          "duplicate",
          "AC25"
        ],
        [
          "E4@M4/R4",
          "日志持久化失败/服务明确拒绝",
          "日志失败不发请求；服务拒绝记录失败及原因，保留可追溯请求",
          "P04/P05",
          "failed",
          "AC26"
        ],
        [
          "E5@M5/R5",
          "受理超时/结果未知/超过自动重试上限",
          "结果待确认，停止盲重投；先查询云状态，超限转人工核实，不承诺物理恰好一次",
          "P05/M05",
          "unknown",
          "AC27"
        ]
      ]
    },
    {
      "id": "UC-STALL-PRINT-SWITCH-003",
      "name": "查看开关操作日志与补打记录",
      "actor": "具备日志查看权限的管理员/商家/运营只读人员",
      "trigger": "查询谁更改了开关，或追查订单补打原因、次数和结果",
      "pre": [
        "已登录并有日志查看权限，查询范围限定在授权商家/食堂/档口。",
        "从档口编辑“打印日志”或订单“补打记录”进入；保留来源上下文。",
        "记录已经产生；没有记录时进入真实空状态而非造数据。"
      ],
      "success": [
        "按筛选条件分页返回完整记录，能看变更前后值或补打各次结果及原因。",
        "订单入口只返回该订单、档口入口继承该档口上下文；打印机ID只用于执行记录筛选；返回路径保留原上下文。",
        "日志只读，敏感字段脱敏，不提供关闭审计/编辑/删除按钮。"
      ],
      "failure": [
        "无权限不显示其他租户/档口记录；查询失败不显示伪造结果。",
        "筛选条件保留，重试能恢复；空结果与读取失败明确区分。"
      ],
      "main": [
        [
          "M1",
          "从档口编辑点“打印日志”或订单详情点“补打记录”",
          "P06/P05/M06/M05",
          "进入日志页，档口/订单自动限定；开关操作和补打记录分两个页签",
          "loaded",
          "AC28"
        ],
        [
          "M2",
          "设置时间、档口/打印机、操作人、结果；补打支持订单号",
          "P06/M06",
          "标签清楚；查询/重置按钮，日期合法性校验，不扩大权限范围",
          "filter",
          "AC29"
        ],
        [
          "M3",
          "点击查询并翻页",
          "P06/M06",
          "加载中骨架/遮罩，结果分页10条，显示总条数",
          "loading/loaded",
          "AC30"
        ],
        [
          "M4",
          "打开记录详情",
          "P06/M06",
          "开关逐项前后值及版本；补打逐次状态、原因、云受理号/时间；关闭返回筛选列表",
          "record-detail",
          "AC31"
        ]
      ],
      "alt": [
        [
          "A1@M2",
          "筛选无结果",
          "显示“暂无符合条件的记录”，提供“重置筛选”",
          "P06/M06",
          "empty",
          "AC32"
        ],
        [
          "A2@M1",
          "从订单进入补打记录",
          "只读订单号条件，查询该订单所有人工/自动尝试，按时间倒序",
          "P05/M05",
          "scoped",
          "AC33"
        ],
        [
          "A3@M4",
          "点击关联订单",
          "有订单查看权限则打开详情；无权限则说明原因且不越权跳转",
          "P03/M03",
          "permission",
          "AC34"
        ]
      ],
      "errors": [
        [
          "E1@M3/R1",
          "查询失败/网络中断",
          "就地错误及“重试查询”；保留筛选，不将失败当空数据",
          "P06/M06",
          "query-error",
          "AC35"
        ],
        [
          "E2@M2/R2",
          "结束日期早于开始日期",
          "日期字段红字，禁止请求；修正后查询",
          "P06/M06",
          "invalid",
          "AC36"
        ],
        [
          "E3@M1/R3",
          "日志查看权限撤销/越权参数",
          "无权限页，不暴露记录数量或详情；返回授权入口",
          "P06/M06",
          "forbidden",
          "AC37"
        ]
      ]
    },
    {
      "id": "UC-STALL-PRINT-SWITCH-004",
      "name": "系统按订单来源与有效打印策略执行首次打印",
      "actor": "支付成功后既有打印触发链路及打印服务",
      "trigger": "线上点餐或线下消费产生符合原规则的首次打印事件",
      "pre": [
        "订单已达到现有合法打印时点，支付/订单状态以现有业务为准。",
        "订单来源、就餐方式/消费类型能确定唯一叶子场景，不能把联网在线/离线或支付方式当业务来源。",
        "目标档口和打印机绑定合法；有效配置可读；迁移映射已经评审。"
      ],
      "success": [
        "命中允许场景且原规则可打印时按既有模板/份数投递；关闭时跳过并记策略原因。",
        "系统运行记录可解释“是否投递及原因”；云服务受理与物理出纸明确分开。",
        "不会影响同机其他档口、其他场景；不重复支付或创建重复订单。"
      ],
      "failure": [
        "未知场景/无效绑定/配置不可用不盲投，保留原订单及可追溯异常。",
        "失败任务进入可解释状态，只在策略允许且结果明确时重试。"
      ],
      "main": [
        [
          "M1",
          "收到原业务合法打印事件",
          "P03/P07",
          "订单详情可看到来源、所属档口及首次打印状态；原型仅模拟该事件",
          "event",
          "AC38"
        ],
        [
          "M2",
          "确定场景和打印目标",
          "P07",
          "事件模拟面板展示分类结果及唯一目标；真实系统无额外弹窗",
          "classified",
          "AC39"
        ],
        [
          "M3",
          "提交前读取当前有效策略",
          "P07",
          "展示“允许/跳过”及命中开关版本；草稿不参与判断",
          "decision",
          "AC40"
        ],
        [
          "M4",
          "允许则调用既有打印，关闭则跳过",
          "P05/P07",
          "订单打印记录分别显示已受理或已跳过及原因",
          "accepted/skipped",
          "AC41"
        ],
        [
          "M5",
          "受理结果回查",
          "P05/P07",
          "明确成功/失败/待确认；失败进入UC002自动补打判定",
          "result",
          "AC42"
        ]
      ],
      "alt": [
        [
          "A1@M3",
          "目标场景关闭",
          "不投递、不伪报打印失败、不在恢复开启后追打历史；其他场景继续",
          "P05/P07",
          "skipped",
          "AC43"
        ],
        [
          "A2@M1",
          "原规则本就不打印",
          "仍不打印；开启新开关不能把不符合原规则的订单强制打印",
          "P05/P07",
          "skipped",
          "AC44"
        ],
        [
          "A3@M3",
          "保存时已有排队任务",
          "尚未受理的按最新有效配置重新判断；已经受理提示无法保证撤回",
          "P05/P07",
          "in-flight",
          "AC45"
        ]
      ],
      "errors": [
        [
          "E1@M2/R1",
          "来源未知或分类重叠",
          "进入分类待核实；不随意归到线上/线下；保留订单及原因",
          "P05/P07",
          "unknown-scene",
          "AC46"
        ],
        [
          "E2@M3/R2",
          "配置读取失败/绑定无效",
          "不盲投；记录失败，恢复后重新读取最新配置再决定是否发送",
          "P05/P07",
          "config-error",
          "AC47"
        ],
        [
          "E3@M4/R3",
          "云服务拒绝或受理结果不明",
          "明确失败可按UC002处理；未知先回查，不能用成功请求码代替出纸证明",
          "P05/P07",
          "failed/unknown",
          "AC48"
        ]
      ]
    }
  ]
}