# Drovio 智能售水平台 PRD（产品版）

## 1. 文档信息

### 1.1 文档基本信息

| 项目 | 内容 |
| --- | --- |
| 文档名称 | Drovio 智能售水平台 PRD（产品版） |
| 文档版本 | V1.0 |
| 输出日期 | 2026-06-07 23:28 |
| 产品阶段 | P1 / MVP |
| 适用对象 | 产品、设计、研发、测试、运营 |
| 文档属性 | 产品需求主文档 |
| 文档目标 | 统一 P1 / MVP / 本期阶段的需求范围、角色边界、核心流程、功能要求、关键业务规则、产品可见状态、异常处理与验收标准，作为后续设计、研发、测试协同的业务依据。 |

### 1.2 文档适用范围

本文件仅覆盖 Drovio 智能售水平台 P1 / MVP / 本期阶段产品需求；三者在本文中为同一优先级概念。当前阶段聚焦直营设备运营最小闭环，覆盖以下业务范围：

- 用户取水与支付闭环
- 套餐购买闭环
- 异常订单与售后闭环
- IC 卡管理闭环（仅用户消费与系统管理员侧）
- 系统管理配置与设备控制闭环

以下能力当前不纳入 P1 / MVP / 本期范围，统一归入 P2 预留：

- 优惠券
- 设备异常报警与运维工单
- 机主协同
- 代理商经营
- 公告与广告
- 知识库与智能客服
- 仓储、设备流转、出入库、库存与盘点
- 平台账号、角色与权限管理
- 平台日志
- 后台看板报表

### 1.3 文档边界说明

本文件用于产品评审与业务对齐，强调业务目标、范围边界、角色职责、流程规则和验收口径。

本文件不承载以下内容：

- 技术方案与系统架构设计
- 数据库表结构与字段定义
- 接口协议与第三方对接细节
- 内部状态机、错误码、日志方案
- 页面编号、原型分包与交互细节说明

上述内容如需输出，应在后续专项文档中单独承接，不与本 PRD 混写。

### 1.4 版本使用原则

- 本文件是 P1 / MVP / 本期产品需求的统一业务口径，三者等价。
- P2 内容作为后续优先级预留；可保留业务逻辑定义，但不纳入本期目标、流程和验收。
- 运维工单、报警工单与相关角色/流程/状态定义如进入 P2 预留，仍保留业务逻辑定义，用于后续优先级版本承接。
- 原型与交互说明后续单独成文，不并入本稿。
- IC 卡模块纳入本期产品版 PRD，但本期仅覆盖用户消费与系统管理员侧管理；机主侧 IC 卡能力为 P2 预留。
- 如后续业务规则调整，应优先更新本文件，再同步影响原型、研发和测试输出。

## 2. 产品概述

### 2.1 产品定位

Drovio 智能售水平台是一套面向直营售水设备运营场景的多端协同产品，用于连接用户取水、套餐购买、异常售后、设备异常处理、运维执行、IC 卡管理与系统管理配置，形成统一的业务闭环。

本期产品定位不是建设完整经营生态，而是以 P1 / MVP 为目标，优先完成直营设备从用户取水到异常处理、从系统管理配置到终端售水的最小可运行闭环。设备异常报警与运维工单、机主协同、仓储流转、内容触达与平台治理类能力保留为 P2 预留，并继续在本文保留完整需求定义。

### 2.2 P1 / MVP 阶段目标

本期以快速上线和形成最小经营闭环为目标，优先完成以下五类业务闭环：

1. 用户取水与支付闭环
2. 套餐购买闭环
3. 异常订单与售后闭环
4. IC 卡管理闭环（仅用户消费与系统管理员侧）
5. 系统管理配置与设备控制闭环

本期产品策略如下：

- 优先保证主流程可运行，不追求一次性覆盖复杂经营场景。
- 优先保证角色边界清晰，不追求复杂组织协作模型。
- 优先保证异常有处理路径，不追求复杂自动化治理。
- 优先保证关键业务可追溯，不在本期展开完整技术治理方案。
- 优先保证 P1 / MVP / 本期口径一致，不将 P2 预留能力混入本期目标与验收。
- 优先保证直营场景落地，不扩展代理、分润、提现、第三方经营等后续能力。

### 2.3 核心名词

| 分类 | 名词 | 定义 |
| --- | --- | --- |
| 角色 | C 端用户 | 使用平台完成取水、查看记录和使用套餐的普通用户；优惠券、公告接收、帮助与客服入口为 P2 预留。 |
| 用户 | User ID | 平台为每位 C 端用户生成的唯一标识，6 位字母数字，与 LINE User ID 1:1 映射；用于后台管理端用户查询和订单追溯。 |
| 用户 | 活跃用户 | 近 15 天内有登录记录的用户；用于用户管理模块的统计和筛选。 |
| 用户 | 赠送额度 | 系统管理员通过后台操作为用户增加的取水额度（泰铢），独立于用户购买的套餐额度，消耗优先级低于实付额度；定位为取水权益的管理手段，不构成独立账户体系。退款时该订单关联的赠送额度清零。 |
| 角色 | 柜机端 | 部署在售水设备上的前台交互端，承接选水、支付、出水和结果反馈。 |
| 角色 | 系统管理员 | 负责系统管理端人工管理操作的角色，承接异常订单与售后处理、设备管理与远程控制、购水套餐配置、设备取水档位配置、纯水单价配置与矿化水单价配置、IC 卡全局管理、平台用户查询与取水额度管理；人工建单、报警工单与工单管理能力保留为 P2 预留定义，公告发布、仓储业务发起、账号权限与基础配置维护为 P2 预留。 |
| 角色 | 系统后端 | 承接规则校验、状态更新、消息同步和业务留痕的系统处理对象；自动建单与自动派发能力保留为 P2 预留定义。 |
| 角色 | 机主 | P2 预留业务角色，可查看设备、发起报修、跟踪工单，并管理本人发出的 IC 卡。 |
| 角色 | 运维 | P2 预留执行角色，负责设备异常处理、工单执行、用料回填、回收与归还；相关定义当前保留在文档中，供后续优先级版本承接。 |
| 角色 | 仓库管理员 | P2 预留执行角色，负责仓内入库、出库、验收、归还确认、回收确认和报废处理。 |
| 设备 | 设备 | 平台中已建档、可被投放、运营、维护和回收的售水设备。 |
| 设备 | 网络状态 | 设备与后端的网络连接状态，分为在线和离线（超过 6 分钟无心跳判定为离线）。 |
| 设备 | 设备运行状态 | 设备当前的运行状况，分为待机、忙碌、关机、维护 4 种状态。告警不影响运行状态，由告警维度独立管理。 |
| 设备 | 售水状态 | 设备是否允许用户取水的状态，分为可售水和不可售水，由系统自动计算并支持管理员通过维护开关手动覆盖。 |
| 设备 | 综合状态周期上报 | 设备每10分钟向服务端上报一次的状态数据包（命令0A），包含机器忙闲、水箱水位、外部水源状态、继电器状态、流量计故障、水量等信息。TDS由独立命令07上报。 |
| 设备 | 高价值配件 | 指屏幕、主板等需要单件追踪的配件（一物一码管理）；在 P2 仓储与流转能力中按单件唯一识别码管理。 |
| 设备 | 普通配件 | 指摄像头、喇叭等按数量管理的配件，不参与一物一码；在 P2 仓储与流转能力中按数量管理，不要求单件唯一识别码。 |
| 设备 | 耗材 | 用于设备维护或更换的物料；滤芯为一物一码管理（入库独立建档，现场安装时绑定到设备），其他耗材按数量管理。 |
| 设备 | 唯一识别码 | 用于识别单台设备或单件高价值配件的唯一编码。 |
| 设备 | 二维码标签 | 承载设备或高价值配件唯一识别码的识别载体，用于首次入库、出库、回收和报废等流转识别。 |
| 订单 | 取水订单 | 用户在一次取水过程中形成的业务记录，用于承载支付、出水、完成和退款结果。 |
| 订单 | 套餐购买订单 | 用户购买全平台通用购水套餐形成的订单记录，单独成表统计，纳入订单模块，与取水订单分开处理。 |
| 订单 | IC 卡充值订单 | 系统管理员对 IC 卡发起充值形成的独立记录，单独成表，与取水订单分开处理；机主侧充值为 P2 预留。 |
| 订单 | 后台订单模块 | 系统管理员在后台集中管理订单的模块，P1 包含全部柜机取水订单和套餐购买订单，不承接 IC 卡充值订单和远程放水记录。 |
| 订单 | 异常订单 | 取水结果未正常闭环、需要进一步排查或补救处理的订单。 |
| 订单 | 应付金额 | 订单按取水档位金额并结合当前支付路径的结算结果后，用户仍需完成的支付金额。P1 / MVP 中，LINE Pay 路径下系统在用户登录后按规则结算套餐后生成应付金额；当套餐全额抵扣时，应付金额为 0，用户仍在同一小程序支付页确认支付成功后返回柜机。IC 卡路径下，应付金额按水类型单价（纯水/矿化水）和档位水量计算。 |
| 订单 | 实付金额 | 用户在本次订单中通过 LINE Pay 或 IC 卡实际支付的金额。P1 / MVP 中，若套餐全额抵扣，则实付金额为 0，但仍归入订单支付成功场景，而不单独拆分套餐全额抵扣确认页面。 |
| 取水 | 取水档位 | 系统管理员为设备配置并在柜机待机页展示的预设取水水量。 |
| 取水 | 水类型 | 售水机支持的两种出水类型，枚举：纯水（经 RO 反渗透过滤）/ 矿化水（经 RO 过滤后再经矿化模块处理）。所有设备统一支持两种水类型，用户在取水时选择。 |
| 取水 | 纯水单价 | 系统管理员在系统配置页面（W23）配置的纯水取水单价，单位为泰铢/L，用于纯水取水订单计价、IC 卡消费和实付补差计算。 |
| 取水 | 矿化水单价 | 系统管理员在系统配置页面（W23）配置的矿化水取水单价，单位为泰铢/L，用于矿化水取水订单计价、IC 卡消费和实付补差计算。 |
| 取水 | ~~设备取水单价~~ | ~~已废弃（2026-06-15 双水类型改造）。原定义拆分为"纯水单价"和"矿化水单价"两个独立配置项。~~ |
| 取水 | 取水档位金额 | 用户选择取水档位和水类型后，系统按水类型单价（纯水/矿化水）和档位水量计算出的本次单次取水金额。 |
| 取水 | 远程放水额度 | 系统管理员远程控制设备放水时输入的放水量，单位为 L，最高 65L。 |
| 取水 | 远程放水记录 | 系统管理员对设备发起远程放水后形成的操作记录，写入设备管理记录和系统留痕，不生成订单。 |
| 取水 | 暂停出水 | 用户在出水过程中通过柜机屏幕、柜机实体按钮或C端小程序触发暂停出水的操作；暂停后展示 3 分钟倒计时，用户可选择继续出水或停止出水；暂停次数上限为 10 次。适用于柜机端和 C 端两种取水方式。 |
| 取水 | 部分出水 | 用户主动停止出水或暂停超时自动停止后，实际出水量小于用户选择水量的取水结果；订单标记为部分出水，系统按实际出水量处理退款。适用于柜机端和 C 端两种取水方式。 |
| 套餐 | 套餐 | 用户可在后续取水过程中使用的全平台通用取水权益。用户购买套餐后获得对应取水额度（泰铢），已获得额度不随后续套餐价格变化而变化。取水时按水类型单价（纯水/矿化水）从额度中扣减对应金额。 |
| 套餐 | 购水套餐 | 由系统管理员配置的全平台通用套餐售卖规则，包含套餐金额（用户实付）、赠送金额（可选）和上架销售时间。用户购买后获得的总额度 = 套餐金额 + 赠送金额。 |
| 套餐 | 套餐上架销售时间 | 购水套餐的起止时间，精确到秒；套餐是否可售由套餐状态字段决定（仅"在售中"可售），上架时间用于驱动状态自动流转（待上架→在售中→已结束）。不限制用户已购买取水额度的使用时间。 |
| 套餐 | 套餐取水额度 | 用户购买套餐后获得的取水额度（泰铢），不设有效期。购买金额和赠送金额均长期可用，不因时间流逝而失效。 |
| 套餐 | 权益回退 | 订单取消、少出水、退款或冲正时，系统按原扣减来源将已启用权益退回原权益账户的处理动作；P1 / MVP 当前适用于套餐额度，优惠券回退能力为 P2 预留。 |
| 套餐 | 优惠券 | 平台向用户发放、可用于取水抵扣的权益，当前优先级为 P2 预留。 |
| 售后 | 售后 | 围绕取水异常产生的退款、补救或结果修正处理。 |
| 售后 | 售后单 | 系统管理员基于已结束取水订单发起的人工售后记录，用于承载售后类型、审批结果、执行结果和处理留痕。 |
| 售后 | 售后类型 | P1 支持部分退款、退额度和全额退款三类人工售后处理方式；其中退额度仅指退回套餐取水额度。 |
| 售后 | 设备异常报警 | 系统根据设备运行数据、联网状态、计量数据和耗材寿命识别出的异常事件。 |
| 售后 | 设备异常报警类型 | 指外部水源无水、流量计故障、设备离线（超过 30 分钟）、滤芯已过期、长时间水位过低五类异常，触发后自动生成工单并派发运维；当前定义保留，优先级调整为 P2 预留。 |
| 售后 | 报警工单 | 由设备异常报警自动触发生成，并进入运维处理链路的工单；当前定义保留，优先级调整为 P2 预留。 |
| 售后 | 工单 | 围绕设备异常、报修、维修、回收等处理过程形成的任务记录；当前定义保留，优先级调整为 P2 预留。 |
| IC 卡 | IC 卡 | 平台支持的实体卡介质，可用于取水消费及相关管理。 |
| IC 卡 | IC卡号 | IC 卡的唯一识别号。系统在发卡时记录 IC卡号，并据此建立卡片唯一业务关联。 |
| IC 卡 | IC 卡台账 | 围绕 IC 卡发卡、充值、消费、退款、停用、启用、冲正、补差冻结与释放形成的记录集合。 |
| 内容 | 公告 | 平台面向用户、机主或终端发布的通知、规则说明或活动信息，当前优先级为 P2 预留。 |
| 取水 | 取水二维码 | 柜机屏幕待机页展示的动态二维码，承载 LIFF URL，绑定柜机设备，每 5 分钟自动刷新。C 端用户通过 LINE 扫码进入完整取水流程。仅在设备正常可售水状态下展示，设备忙碌、离线、维护或不可售水时隐藏。 |
| 取水 | C 端扫码取水 | 用户通过 LINE 扫描柜机取水二维码，在 C 端小程序内完成选档位、支付、出水确认的取水方式。与柜机端取水流程统一，交互适配手机端。仅支持 LINE Pay 和套餐支付。 |
| 取水 | 进行中取水 | 用户在 C 端或柜机端发起的取水流程处于未完成状态（选档位中、支付中、出水中）。同一用户同一时间只允许一个进行中取水。 |

## 3. 范围与角色

### 3.1 业务范围

#### P1 业务范围

| 端 | 核心能力 | 详细定义 |
|----|---------|---------|
| 用户侧 | 柜机取水支付、C端扫码取水、套餐购买与使用、订单查看 | §4.2, §5.1, §6.2 |
| 系统管理员侧 | 设备管理与远程控制、订单与售后处理、套餐配置、纯水/矿化水单价配置、IC卡管理、用户额度管理 | §4.5, §5.5, §6.4 |
| IC 卡 | 发卡、充值、消费、退款、停用启用、台账查询；机主侧管理为P2 | §4.4, §5.4 |

#### P2 预留范围

当前不纳入 P1 / MVP 目标与验收。P2 预留模块清单见 §1.2。

| 端 | 核心能力 | 详细定义 |
|----|---------|---------|
| 机主 | 设备查看、报修与工单跟踪、公告接收、IC卡管理 | §5.7, §6.5 |
| 运维 | 工单接收与处理、维修回填、现场安装拆卸、配件领用 | §5.8, §6.6 |
| 仓库管理员 | 入库验收、出库确认、盘点、领用归还、报废处理 | §5.9, §6.7 |

### 3.2 角色定义

角色完整定义见 §2.3 核心名词表。以下列出各角色在本 PRD 中的当前阶段职责。

| 角色 | 当前阶段职责 |
|------|------------|
| C 端用户 | 取水、支付、查看订单、使用套餐（P1） |
| 系统管理员 | 设备管理与远程控制、订单与售后处理、套餐配置、纯水/矿化水单价配置、IC卡管理、用户额度管理（P1）；人工建单/报警工单/工单管理为P2预留 |
| 系统后端 | 规则校验、状态更新、消息同步、业务留痕（P1） |
| 机主 | 设备查看、报修与工单跟踪、公告接收、IC卡管理（P2预留） |
| 运维 | 工单接收与处理、维修回填、现场安装拆卸、配件领用（P2预留） |
| 仓库管理员 | 入库验收、出库确认、盘点、领用归还、报废处理（P2预留） |

### 3.3 角色边界补充

以下为 §2.3 角色定义中未明确的补充约束：

- 用户只参与取水与结果查看，不参与设备管理、工单处理、仓储流转或系统管理。
- 机主仅管理本人设备，不管理其他机主设备，不进入资金结算域；仅管理本人发出的 IC 卡。
- 运维负责执行，不定义业务规则，不负责套餐价格、取水档位与单价配置，不承担公告或 IC 卡管理。
- 仓库管理员负责仓内物料与设备流转，不负责订单、售后、公告管理、设备远程控制和业务规则配置。

### 3.4 P2 范围声明

P2 为后续优先级范围，当前不纳入 P1 / MVP / 本期目标、流程与验收。P2 预留模块清单见 §1.2。

## 4. 核心业务规则与产品边界

### 4.1 直营闭环原则

- P1 / MVP / 本期仅服务直营设备运营场景，三者口径一致。
- 当前阶段只保留支撑快速上线与投入运行的 5 条核心业务闭环。
- 设备异常报警与运维工单、机主协同、仓储与设备流转、公告与内容触达、平台治理类能力统一调整为 P2 预留。

### 4.2 用户取水与支付规则

**A. 通用规则与主链路定义**

| 编号 | 规则 |
|------|------|
| 4.2-01 | 用户取水主链路固定为：选水档位 → 选水类型（纯水/矿化水） → 支付方式选择 → 分支付路径处理 → 支付成功页/取水支付结果页 → 放桶确认 → 出水 → 结果确认。 |
| 4.2-02 | 用户取水必须基于预设档位，不支持自由输入水量。 |
| 4.2-03 | **条件：** 设备未配置取水档位或未配置纯水单价或未配置矿化水单价。<br>**操作：** 系统不允许设备进入可售水状态，柜机不展示取水档位。<br>**结果：** 系统管理端提示需完成取水档位与纯水单价、矿化水单价配置。 |
| 4.2-05 | P1 支持 LINE Pay、IC 卡、Alipay、WeChat Pay 和套餐抵扣五种支付路径；C 端扫码取水仅支持 LINE Pay 和套餐抵扣（套餐补差仅 LINE Pay），不支持 IC 卡、Alipay 和 WeChat Pay。P1 不提供现金余额账户，不提供其他支付方式扩展。 |
| 4.2-06 | 用户侧仅感知支付结果与订单结果，不展示内部处理节点。 |
| 4.2-07 | 登录超时返回 LINE Pay 登录二维码页；支付超时或补差失败返回支付方式页（柜机端）或跳转取消页（C 端）；如存在冻结金额，应同步释放。 |

**B. 选水与订单生成**

| 编号 | 规则 |
|------|------|
| 4.2-08 | 用户在柜机待机页选择取水档位和水类型后，柜机进入支付方式页。选择顺序：先选水量（档位）→ 再选水类型，档位按钮下方价格随水类型实时更新。 |
| 4.2-09 | **条件：** 设备已配置取水档位、纯水单价和矿化水单价，且用户选择取水档位和水类型。<br>**操作：** 系统按水类型单价（纯水/矿化水）和档位水量计算取水档位金额。<br>**结果：** IC 卡消费、LINE Pay 实付和补差金额按所选水类型单价计算，口径唯一。 |
| 4.2-10 | **条件：** 用户进入取水主链路并生成本次取水交易。<br>**操作：** 系统创建取水订单并写入订单模块。<br>**结果：** 取水订单在支付、出水、取消、异常和售后处理中持续更新。 |
| 4.2-11 | **条件：** 柜机发起取水订单。<br>**操作：** 系统不论用户最终选择 IC 卡、IC 卡补差、LINE Pay、Alipay 或 WeChat Pay 路径，且不论本次订单是否产生实付金额，统一将本次取水订单写入后台订单模块。<br>**结果：** 系统管理员可在订单模块集中查询全部柜机取水订单，并按规则发起人工售后。 |

**C. IC 卡支付**

| 编号 | 规则 |
|------|------|
| 4.2-12 | **条件：** 用户选择 IC 卡。<br>**操作：** 柜机展示刷卡提示页并等待刷卡。<br>**结果：** 进入 IC 卡支付流程。 |
| 4.2-13 | **条件：** IC 卡刷卡后卡不可用或未识别到卡片。<br>**操作：** 柜机展示刷卡异常页，提示异常原因。<br>**结果：** 用户可选择重试刷卡或返回支付方式选择页。 |
| 4.2-14 | **条件：** IC 卡状态可用且卡内余额满足取水档位金额。<br>**操作：** 按水类型单价和档位水量计算出的取水档位金额完成 IC 卡扣款。<br>**结果：** 进入柜机支付成功页。 |
| 4.2-15 | **条件：** IC 卡状态可用、卡内余额小于取水档位金额。<br>**操作：** 柜机按取水档位金额与卡内可用余额计算差额，并展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付。<br>**结果：** 用户选择扫码支付方式完成补差后进入柜机支付成功页。 |
| 4.2-16 | **条件：** IC 卡余额不足且不满足补差条件。<br>**操作：** 停止当前支付路径。<br>**结果：** 返回支付方式页。 |

**D. LINE Pay 支付**

| 编号 | 规则 |
|------|------|
| 4.2-17 | **条件：** 用户选择 LINE Pay。<br>**操作：** 柜机展示登录二维码页。<br>**结果：** 用户扫码登录后进入小程序支付流程。 |
| 4.2-18 | **条件：** 用户完成 LINE Pay 登录。<br>**操作：** 柜机进入提示登录成功页，展示订单摘要（水类型、档位水量、水类型单价、取水档位金额、套餐抵扣情况、应付金额），提示用户在 3 分钟内完成支付并展示倒计时；系统自动校验套餐，并在小程序支付页展示结算结果与应付金额；优惠券结算能力为 P2 预留。<br>**结果：** 用户在小程序点击支付；当套餐全额抵扣导致应付金额等于 0 时，仍归入订单支付成功场景。 |
| 4.2-19 | **条件：** 柜机提示登录成功页倒计时超时。<br>**操作：** 柜机结束本次登录态。<br>**结果：** 返回 LINE Pay 登录二维码页，用户可重新扫码登录。 |
| 4.2-20 | **条件：** LINE Pay 登录超时。<br>**操作：** 柜机结束本次登录态。<br>**结果：** 返回 LINE Pay 登录二维码页，用户可重新扫码登录。 |
| 4.2-21 | **条件：** 同一 LINE 账号已在一台设备上发起取水且订单未结束。<br>**操作：** 用户在另一台设备上选择 LINE Pay 路径扫码登录。<br>**结果：** 系统检测到存在进行中的取水订单，柜机提示"您有正在进行的取水订单，请完成后重试"，阻断本次登录。 |

**E. Alipay / WeChat Pay 支付**

| 编号 | 规则 |
|------|------|
| 4.2-22 | **条件：** 用户选择 Alipay 或 WeChat Pay。<br>**操作：** 柜机展示对应支付渠道的扫码支付二维码页，展示订单摘要（水类型、档位水量、水类型单价、取水档位金额）和应付金额。<br>**结果：** 用户使用对应支付 App 扫码完成支付。 |
| 4.2-23 | **条件：** Alipay 或 WeChat Pay 支付成功。<br>**操作：** 柜机收到支付成功回调。<br>**结果：** 进入柜机支付成功页。 |
| 4.2-24 | **条件：** Alipay 或 WeChat Pay 支付失败、取消或超时。<br>**操作：** 结束本次支付尝试。<br>**结果：** 返回支付方式页，用户可重新选择支付路径。 |

**F. 支付结果与放桶**

| 编号 | 规则 |
|------|------|
| 4.2-25 | 柜机支付成功页即放桶提示页，展示订单摘要（水类型、档位水量、水类型单价、取水档位金额）和支付方式，柜机展示"支付成功，请放好水桶"后进入取水承接环节。 |
| 4.2-26 | **条件：** 用户在支付成功页放入水桶并点击开始取水（柜机屏幕按钮或绿色实体按钮）。<br>**操作：** 柜机进入出水页，展示本次订单摘要（水类型、档位水量、水类型单价、取水档位金额）、支付方式、已出水量和出水进度条，提示"正在取水中，请稍后"。<br>**结果：** 出水完成后进入出水结果页。 |
| 4.2-27 | **条件：** 用户在柜机支付成功页超过 5 分钟未确认放桶。<br>**操作：** 系统自动取消本次取水订单，触发退款流程。<br>**结果：** 权益按原扣减来源返还，实付金额按原支付路径退款；订单状态更新为已取消。 |
| 4.2-28 | **条件：** 支付成功后柜机出水失败（设备故障、无水）。<br>**操作：** 系统自动发起退款。<br>**结果：** 实付金额按原支付路径退款，套餐额度按原扣减来源返还。 |

**G. 出水过程控制**

| 编号 | 规则 |
|------|------|
| 4.2-29 | **条件：** 用户在出水过程中触发暂停出水（柜机屏幕/柜机红色实体按钮/C端小程序）。<br>**操作：** 柜机暂停出水，展示暂停状态和 3 分钟倒计时。<br>**结果：** 暂停期间订单状态仍为已支付取水中，已出水量保持不变。 |
| 4.2-30 | **条件：** 用户暂停后触发继续出水（柜机屏幕/柜机绿色实体按钮/C端小程序）。<br>**操作：** 柜机恢复出水，继续累计已出水量。<br>**结果：** 出水进度继续推进。 |
| 4.2-31 | **条件：** 用户暂停后点击停止出水。<br>**操作：** 柜机停止出水，系统按实际出水量触发部分出水退款。<br>**结果：** 订单状态更新为已完成，出水类型标记为部分出水，售后结果进入退款处理。 |
| 4.2-32 | **条件：** 暂停后 3 分钟倒计时超时。<br>**操作：** 柜机自动停止出水，系统按实际出水量触发部分出水退款。<br>**结果：** 订单状态更新为已完成，出水类型标记为部分出水，售后结果进入退款处理。 |
| 4.2-33 | **条件：** 暂停次数达到 10 次。<br>**操作：** 暂停按钮不可用，出水继续进行直至完成。<br>**结果：** 用户无法再次暂停。 |

**H. 退款、售后与异常处理**

| 编号 | 规则 |
|------|------|
| 4.2-34 | **条件：** 小程序支付失败、取消或超时。<br>**操作：** 结束本次支付尝试。<br>**结果：** 柜机端返回支付方式页，用户可重新选择支付路径；C 端跳转取水订单已取消页，展示取消原因和返回首页入口。 |
| 4.2-35 | **条件：** 补差支付取消或失败后，系统尝试释放已形成的冻结金额，但释放失败。<br>**操作：** 系统标记该笔记录为异常，生成取水记录异常告警。<br>**结果：** 系统管理员可在后台查看异常记录，标记为已处理或主动发起订单退款。 |
| 4.2-36 | **条件：** 系统管理员对已完成或已取消的取水订单发起人工售后。<br>**操作：** 系统校验订单类型、订单状态和是否已存在售后单；校验通过后生成售后单并进入审批。<br>**结果：** 人工售后仅作用于取水订单，且单一取水订单在 P1 / MVP 阶段仅允许 1 笔售后单。 |
| 4.2-37 | **条件：** 订单为套餐购买订单或 IC 卡充值订单。<br>**操作：** 不适用取水订单人工售后规则。<br>**结果：** 相关订单处理逻辑与取水订单分开。 |
| 4.2-38 | **条件：** 人工售后审批通过且售后类型为部分退款。<br>**操作：** 系统校验退款金额大于 0 且不超过本次订单剩余可退实付金额；校验通过后仅退回本次订单实付金额。<br>**结果：** 售后单状态和订单售后结果同步更新。 |
| 4.2-39 | **条件：** 人工售后审批通过且售后类型为退额度。<br>**操作：** 系统校验退回额度大于 0 且不超过本次订单已扣减的套餐取水额度；校验通过后仅退回本次订单已扣减的套餐取水额度。<br>**结果：** 售后单状态和订单售后结果同步更新。 |
| 4.2-40 | **条件：** 人工售后审批通过且售后类型为全额退款。<br>**操作：** 系统按原扣减来源执行权益回退与实付退款。<br>**结果：** 套餐和实付金额按当前启用规则回退或退款；如后续启用优惠券能力，仍按原规则回退，售后单状态和订单售后结果同步更新。 |
| 4.2-41 | **条件：** 人工售后审批未通过。<br>**操作：** 系统不执行退款或额度回退。<br>**结果：** 售后单状态更新为已驳回。 |

**I. C 端扫码取水规则**

**入口与二维码**

| 编号 | 规则 |
|------|------|
| 4.2-42 | 取水二维码为动态二维码，每 5 分钟自动刷新，承载 LIFF URL，绑定柜机设备。用户通过 LINE 扫码进入 C 端小程序取水流程。 |
| 4.2-43 | 柜机待机页在设备正常可售水状态下展示"扫码取水"按钮，点击后弹窗展示动态取水二维码；设备忙碌、离线、维护或不可售水时按钮隐藏。 |
| 4.2-44 | **条件：** 用户扫取水二维码时设备忙碌。<br>**操作：** 系统检测到设备存在进行中的取水订单。<br>**结果：** C 端提示"设备忙，存在其他订单，请稍后再试"。 |
| 4.2-45 | **条件：** 用户扫取水二维码时设备离线。<br>**操作：** 系统检测到设备离线。<br>**结果：** C 端提示"设备当前不可用，请稍后再试"。 |
| 4.2-46 | **条件：** 用户扫取水二维码时设备处于维护或不可售水状态。<br>**操作：** 系统检测到设备不可售水。<br>**结果：** C 端提示"设备当前不可取水，请稍后再试"。 |
| 4.2-46a | **条件：** 用户扫取水二维码时设备水位低（低液位浮球触发，无条件不可售水）。<br>**操作：** 系统检测到设备水位低。<br>**结果：** C 端提示"设备水位过低，暂不支持取水，设备正在制水中，请稍后重试"。异常提示页统一展示设备摘要信息（设备编号、名称、投放位置、运行状态、当前水位）。 |
| 4.2-47 | **条件：** 用户扫取水二维码时二维码已过期（超过 5 分钟）。<br>**操作：** 系统校验二维码有效性。<br>**结果：** C 端提示"二维码已过期，请重新扫描"。 |
| 4.2-48 | **条件：** 用户扫取水二维码后未登录。<br>**操作：** 系统检测到用户未登录 LINE。<br>**结果：** C 端提示用户登录 LINE 后继续操作。 |
| 4.2-49 | **条件：** 用户扫取水二维码后已登录，但已存在进行中的取水订单。<br>**操作：** 系统检测到该用户已有未完成的取水订单。<br>**结果：** C 端提示"您有进行中的取水订单，请先完成"，并展示进行中订单信息。 |
| 4.2-50 | **条件：** IC 卡用户扫取水二维码。<br>**操作：** IC 卡用户无法在 C 端发起取水流程。<br>**结果：** C 端提示"IC 卡用户请在柜机端取水"。IC 卡用户可在 C 端进行补差操作（柜机端已选好档位，IC 卡余额不足时生成的支付码）。 |

**选档位与支付**

| 编号 | 规则 |
|------|------|
| 4.2-51 | C 端扫码取水主流程：选档位 → 选支付方式 → 支付 → 取水支付结果页（放桶确认） → 出水 → 结果。流程与柜机端统一，交互适配手机端。 |
| 4.2-52 | C 端选档位页面展示：柜机位置信息（文字地址 + 设备编号）、操作提示、取水档位按钮（含价格）→ 水类型选择（纯水/矿化水）→ 价格随水类型实时更新。套餐用户额外展示套餐剩余额度（泰铢）。选择顺序：先选水量（档位）→ 再选水类型。 |
| 4.2-53 | C 端扫码取水仅支持 LINE Pay 和套餐支付两种方式；套餐抵扣后需要补差时，补差仅支持 LINE Pay。微信支付和支付宝仅限柜机端使用。 |
| 4.2-54 | **条件：** 套餐用户选档位后套餐额度足够。<br>**操作：** 系统展示套餐抵扣确认页。<br>**结果：** 用户确认后直接进入出水环节。 |
| 4.2-55 | **条件：** 套餐用户选档位后套餐额度不足。<br>**操作：** 系统展示支付页（套餐抵扣 + LINE Pay 补差）。<br>**结果：** 用户完成补差后进入出水环节。 |
| 4.2-56 | C 端支付页场景（全额 LINE Pay、IC 卡补差、套餐全额抵扣、套餐+LINE Pay 补差、IC 卡+LINE Pay 补差）均展示水类型、单价、金额和 5 分钟支付倒计时，超时自动取消订单并跳转取水订单已取消页；用户点击返回时弹窗提示"返回将自动取消本次订单"，确认后跳转取水订单已取消页。 |
| 4.2-57 | **条件：** C 端支付成功或套餐全额抵扣确认。<br>**操作：** 跳转 C 端取水支付结果页，展示支付成功确认、取水量、订单信息和 5 分钟放桶倒计时。<br>**结果：** 用户确认放桶后进入出水环节；超时未放桶自动取消订单并退款。 |
| 4.2-58 | C 端扫码取水订单与柜机端取水订单统一管理，订单号格式一致（DR 前缀），不区分取水来源。 |

**流程异常与取消**

| 编号 | 规则 |
|------|------|
| 4.2-59 | **条件：** 用户在 C 端选档位后 5 分钟内未完成支付。<br>**操作：** 系统自动取消本次取水流程。<br>**结果：** 设备释放，用户跳转取水订单已取消页，展示取消原因和返回首页入口。 |
| 4.2-60 | **条件：** 用户在 C 端取水流程中设备状态发生变化（如变为离线或维护）。<br>**操作：** 系统实时检测设备状态。<br>**结果：** C 端提示设备状态变化，自动取消流程，用户回到小程序首页。 |
| 4.2-61 | **条件：** 用户在 C 端取水流程中主动取消（每步均可取消）。<br>**操作：** 用户点击取消按钮。<br>**结果：** 取水流程取消，设备释放，用户回到小程序首页。 |

**C 端出水与结果**

| 编号 | 规则 |
|------|------|
| 4.2-62 | 出水环节两端均可触发、均可暂停、均可停止、实时同步。C 端出水页面展示进度条、实时出水量、暂停按钮和停止按钮（二次确认）；暂停后展示 3 分钟倒计时，暂停次数上限为 10 次。 |
| 4.2-63 | **条件：** 用户在 C 端出水过程中退出页面。<br>**操作：** 柜机端继续出水不受影响。<br>**结果：** 用户可通过 C 端首页"进行中取水"卡片回到出水页面。 |
| 4.2-64 | **条件：** 出水过程中用户点击停止出水。<br>**操作：** 系统二次确认后停止出水。<br>**结果：** 系统按实际出水量触发部分出水退款。 |
| 4.2-65 | C 端取水结果页展示核心结果信息（出水量、金额、订单号、状态），详细信息（退款等）跳转取水订单详情页查看。取水完成后"进行中取水"卡片自动消失。 |
| 4.2-66 | 远程代付场景下，订单归属支付人（即在 C 端完成登录和支付的用户），退款原路退回支付人。 |
| 4.2-67 | C 端操作期间，柜机屏幕同步显示 C 端当前操作状态，柜机端按钮保持可用，用户可在柜机端继续完成同一个取水流程。 |

**设备状态与柜机端限制**

| 编号 | 规则 |
|------|------|
| 4.2-68 | 柜机端设备离线时：待机页展示灰色离线状态横幅，提示"设备离线，暂不支持取水"，附刷新按钮（跳转加载页后返回首页）；取水档位置灰不可选；水类型选择器隐藏；开始取水按钮隐藏，由离线横幅替代；不展示扫码取水按钮。离线时不可售水，不进入取水流程。 |
| 4.2-69 | 柜机端设备维护或不可售水时：完全不支持取水，待机页开始取水按钮隐藏，由橙色状态横幅替代（维护时提示"设备维护中，暂不支持取水"；低水位时提示"水箱水位过低，正在制水中，请稍后取水"），附刷新按钮；取水档位置灰不可选；不展示扫码取水按钮。水位低（低液位浮球触发）时无条件不可售水，不依赖外部水源状态。多状态并存时优先级：离线 > 维护 > 低水位（维护+低水位同时存在时展示维护横幅）。 |

**水类型选择与免费模式**

| 编号 | 规则 |
|------|------|
| 4.2-71 | **条件：** 用户选择取水档位后。<br>**操作：** 系统展示水类型选择（纯水/矿化水），用户选择后按对应水类型单价计算取水金额；档位按钮下方价格随水类型实时更新。<br>**结果：** 选好水类型后进入支付方式页。 |
| 4.2-72 | **条件：** 设备开启免费打水模式。<br>**操作：** 两种水类型均免费，用户选择水类型和档位后无需支付。<br>**结果：** 直接进入出水环节。 |
| 4.2-73 | **条件：** 设备关闭售水功能。<br>**操作：** 两种水类型均不可售水。<br>**结果：** 设备进入不可售水状态。 |



### 4.3 权益抵扣与退款规则

**A. 套餐购买与额度**

| 编号 | 规则 |
|------|------|
| 4.3-01 | P1 / MVP 当前仅支持套餐权益；优惠券能力整体调整为 P2 预留。 |
| 4.3-02 | P1 / MVP 单笔订单最多使用 1 份套餐；如后续启用优惠券能力，仍沿用单笔最多使用 1 张优惠券的口径。 |
| 4.3-03 | **条件：** 用户购买套餐成功。<br>**操作：** 系统按全平台通用套餐配置生成对应取水额度（泰铢），总额度 = 套餐金额 + 赠送金额。<br>**结果：** 该取水额度归属用户，后续套餐价格调整不影响已获得额度；购买金额和赠送金额不设有效期，余额长期可用。 |
| 4.3-04 | **条件：** 用户后续再次购买套餐。<br>**操作：** 系统按购买时处于上架销售期内的全平台通用套餐价格结算。<br>**结果：** 用户获得本次购买对应取水额度。 |
| 4.3-05 | **条件：** 用户进入套餐购买流程。<br>**操作：** 用户可通过柜机套餐购买二维码入口或 LINE 小程序入口购买全平台通用购水套餐。<br>**结果：** 购买入口不改变套餐价格口径。 |
| 4.3-05a | **条件：** 系统管理员在后台用户列表为用户赠送取水额度。<br>**操作：** 管理员输入赠送额度（泰铢）和备注，确认后立即生效。<br>**结果：** 用户取水额度（泰铢）增加，C 端实时同步；赠送额度独立于购买额度，不参与退款计算，退款时该订单关联的赠送额度清零。 |
| 4.3-05b | **条件：** 系统管理员在后台用户列表扣除用户取水额度。<br>**操作：** 管理员输入扣除额度（泰铢）和备注，确认后立即生效。<br>**结果：** 系统优先扣除赠送剩余额度（泰铢），超出部分扣除购买剩余额度（泰铢）；扣除后用户剩余额度不低于 0；扣除超出赠送额度时系统弹出二次确认警告；C 端实时同步。 |
| 4.3-05c | 用户取水额度（泰铢）包含购买额度（实付）和赠送额度两种来源。取水消耗时优先消耗购买额度（实付），购买额度用完后再消耗赠送额度。多次购买的购买额度按 FIFO（先进先出）顺序消耗。取水消耗金额 = 取水量 × 对应水类型单价（纯水/矿化水）。 |
| 4.3-05c-1 | **额度扣减顺序说明：** 管理员手动"扣除"（4.3-05b）和用户取水"消耗"（4.3-05c）的扣减顺序不同。扣除操作优先扣赠送额度（保护用户自费购买的额度），消耗操作优先扣购买额度（赠送额度作为储备）。两者独立运作，不互相影响。 |
| 4.3-05d | 赠送额度不设有效期，仅在退款时清零。退款时该订单关联的赠送额度清零；用户名下所有套餐订单均退款后，赠送额度自动清零。 |

**B. 套餐抵扣规则**

| 编号 | 规则 |
|------|------|
| 4.3-06 | **条件：** 用户使用套餐额度取水。<br>**操作：** 系统按本次取水量 × 对应水类型单价（纯水/矿化水）计算消耗金额，从套餐额度（泰铢）中扣减。<br>**结果：** 套餐额度按实际消费金额扣减，不同水类型消耗金额不同。 |
| 4.3-07 | **条件：** 用户通过 LINE Pay 路径完成扫码登录。<br>**操作：** 系统自动按规则结算套餐；优惠券结算能力为 P2 预留。<br>**结果：** 生成本次应付金额或套餐全额抵扣结果；用户不手动选择权益，且两者都在同一小程序支付页完成确认。 |
| 4.3-08 | **条件：** 用户选择 IC 卡支付路径。<br>**操作：** 本次订单不校验用户套餐资产。<br>**结果：** 订单仅按 IC 卡与补差路径完成支付。 |
| 4.3-09 | P1 / MVP 当前抵扣顺序固定为：套餐、实付金额；如后续启用优惠券能力，仍沿用"优惠券、套餐、实付金额"的口径。 |
| 4.3-10 | **条件：** 套餐足额覆盖订单金额。<br>**操作：** 用户仍需在同一小程序支付页点击支付完成本次结算确认。<br>**结果：** 订单按支付成功处理后进入柜机支付成功页，不单独拆分套餐全额抵扣确认场景。 |
| 4.3-11 | **条件：** 套餐不足以全额支付。<br>**操作：** 用户在同一小程序支付页完成差价支付。<br>**结果：** 支付成功后进入柜机支付成功页。 |
| 4.3-12 | C 端扫码取水的套餐抵扣规则与柜机端一致：套餐用户选档位后，系统自动校验套餐额度并展示抵扣确认页或补差支付页。 |
| 4.3-13 | 权益仅参与取水相关抵扣，不扩展为独立账户体系；优惠券相关抵扣、回退和少出水处理逻辑保留为 P2 预留需求定义。 |

**C. 退款与额度回退**

| 编号 | 规则 |
|------|------|
| 4.3-14 | 取消、少出水（含用户主动停止和暂停超时）、退款、冲正场景均按原扣减来源返还。 |
| 4.3-15 | 如订单同时存在权益和实付金额，处理顺序固定为：权益优先回退，实付后退。 |
| 4.3-16 | 套餐额度扣减采用预扣机制：支付成功时按用户选择水量 × 水类型单价全额预扣套餐额度（泰铢），出水完成后按实际出水量 × 水类型单价修正。部分出水场景下，仅保留实际出水量对应金额，差额回退至用户套餐余额（泰铢）。 |
| 4.3-17 | **条件：** 取水订单使用套餐额度支付，且实际出水量小于用户选择水量（含设备异常、用户主动停止、暂停超时）。<br>**操作：** 系统按实际出水量 × 水类型单价重新计算套餐应扣金额（泰铢）。<br>**结果：** 仅扣除实际出水量对应套餐金额，差额回退至用户套餐余额（泰铢）。 |
| 4.3-18 | **条件：** 取水订单使用套餐额度支付，且实际出水量为 0。<br>**操作：** 系统回退本次订单已扣套餐额度（泰铢）。<br>**结果：** 本次套餐额度不产生消耗。 |
| 4.3-19 | 优惠券少出水处理口径保留为 P2 预留逻辑，不纳入当前 P1 / MVP 交付与验收。 |
| 4.3-20 | **条件：** 取水订单同时存在套餐额度和实付金额，且发生少出水（含用户主动停止和暂停超时）。<br>**操作：** 系统先按实际出水量 × 水类型单价修正套餐额度扣减（泰铢），再按原支付路径退回多收实付金额。<br>**结果：** 仍保持权益优先回退，实付后退。 |
| 4.3-21 | **条件：** 实际出水量无法确认。<br>**操作：** 系统进入终值缺失排查。<br>**结果：** 不直接执行套餐额度回退或实付退款，待结果确认后按最终出水量处理。 |
| 4.3-22 | 少出水场景（含用户主动停止和暂停超时）自动生成售后并按原扣减来源处理，不进入人工审核主链路。 |
| 4.3-23 | 终值缺失场景先进入异常排查，不直接生成售后。 |
| 4.3-24 | C 端扫码取水的退款规则与柜机端一致：少出水退款按实际出水量处理，退款原路退回支付人。 |
| 4.3-25 | 远程代付场景下，订单归属支付人（即在 C 端完成登录和支付的用户），退款原路退回支付人。 |
| 4.3-26 | 用户购买套餐时，应按当前处于上架销售期内的全平台通用套餐价格生成支付金额。 |
| 4.3-27 | **条件：** 用户对已支付的套餐订单发起退款。<br>**操作：** 系统计算退款金额 = 订单实付金额 − 已消耗实付金额（泰铢）；已消耗实付金额按 FIFO 顺序从各笔购买额度中扣减。<br>**结果：** 退款金额 > 0 时系统自动执行原路退款（LINE Pay），无需人工审核；退款金额 ≤ 0 时在 C 端申请弹窗中展示完整计算明细和不可退原因，不允许提交退款申请；退款时该订单关联的赠送额度清零。C 端申请弹窗展示：套餐金额、已消费金额、剩余实付金额、退款金额，并提示"退款后本次订单赠送的 XX 泰铢额度将清零"。 |
| 4.3-27a | 退款仅计算实付额度的消耗，赠送额度不参与退款计算。多套餐按订单逐笔退款，已消耗实付额度按 FIFO（先进先出）顺序分配到各笔订单。单笔退款时，该订单关联的赠送额度清零，额度变动记录标记为"退款清零"类型。 |
| 4.3-27b | **条件：** 套餐订单购买额度已全部消耗。<br>**操作：** C 端套餐订单详情页（C04）屏蔽"申请退款"按钮。<br>**结果：** 用户无法对已用完购买额度的订单发起退款。 |
| 4.3-27c | 套餐购买页（C05）和套餐订单详情页（C04）底部展示退款规则说明，告知用户退款公式和限制条件。套餐详情页（C11）提供"使用须知"弹窗，展示购买、使用和退款规则。 |

### 4.4 IC 卡业务规则

**A. 通用规则与范围**

| 编号 | 规则 |
|------|------|
| 4.4-01 | IC 卡纳入 P1 / MVP 正式范围，当前覆盖用户持卡消费、扫码补差（LINE Pay / Alipay / WeChat Pay）、系统管理员发卡 / 直接充值 / 状态管理 / 台账查询；机主侧发卡、充值与台账查看为 P2 预留。 |
| 4.4-02 | IC 卡余额单位为金额（泰铢）；充值余额用于按水类型单价（纯水/矿化水）计费的 IC 卡消费，与购水套餐价格体系无关。IC 卡消费记录备注展示水类型+单价。 |
| 4.4-03 | IC 卡业务以用户消费与系统管理端全局管理为主，不扩展为独立资金产品。 |
| 4.4-04 | IC 卡不绑定用户，不扩展为记名账户体系。 |

**B. 发卡与管理**

| 编号 | 规则 |
|------|------|
| 4.4-05 | 发卡时以 IC卡号 作为卡片唯一识别号；系统记录 IC卡号 并建立唯一卡片业务关联。 |
| 4.4-06 | 新发 IC 卡初始状态为可用，初始余额为 0；发卡后不强制首充。 |
| 4.4-07 | 发卡成功后，方可对该卡执行充值、消费、停用、启用和台账查询等后续动作。 |
| 4.4-08 | 系统管理员可执行发卡、直接充值、停用、启用和台账查看；机主只能管理本人发出的 IC 卡，机主侧管理能力为 P2 预留。 |
| 4.4-09 | 停用与启用仅能由系统管理员执行；停用卡不可消费，不可充值，恢复启用后方可继续使用。 |

**C. 充值**

| 编号 | 规则 |
|------|------|
| 4.4-10 | 系统管理员可直接对指定 IC 卡充值；充值金额必须大于 0，且必须填写充值原因。 |
| 4.4-11 | **条件：** 系统管理员发起 IC 卡充值。<br>**操作：** 系统生成独立 IC 卡充值订单并记录充值结果。<br>**结果：** IC 卡充值订单与取水订单分开存储和处理。 |
| 4.4-12 | 机主端充值与系统管理员直接充值并行存在的完整口径保留为 P2 预留；P1 / MVP 当前仅验收系统管理员直接充值能力。 |

**D. 消费与支付**

| 编号 | 规则 |
|------|------|
| 4.4-13 | 用户在柜机支付方式页选择 IC 卡后，柜机进入 IC 卡刷卡提示页。 |
| 4.4-14 | IC 卡支付路径不校验用户套餐资产；IC 卡消费金额按水类型单价（纯水/矿化水）和档位水量计算，与购水套餐价格体系无关。 |
| 4.4-15 | **条件：** IC 卡状态可用且卡内余额满足取水档位金额。<br>**操作：** 完成 IC 卡直接消费。<br>**结果：** 进入柜机支付成功页。 |
| 4.4-16 | **条件：** 设备在线、IC 卡状态可用、卡内余额小于取水档位金额。<br>**操作：** 柜机可展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付；C 端用户也可通过 LINE Pay 代付补差；卡内余额可以为 0。<br>**结果：** 用户选择扫码支付方式完成补差后进入柜机支付成功页。补差金额 = 取水金额 − IC 卡余额。 |
| 4.4-17 | **条件：** 设备在线、卡内余额不足且不满足补差条件。<br>**操作：** 不得继续 IC 卡消费。<br>**结果：** 返回支付方式选择。 |

**E. 台账与退款**

| 编号 | 规则 |
|------|------|
| 4.4-18 | IC 卡台账至少包含以下记录类型：发卡、充值、消费、退款、停用、启用、冲正、补差冻结、补差释放。 |
| 4.4-19 | 发生补差、退款、冲正或状态变更时，必须形成对应台账记录。 |
| 4.4-20 | 发生退款或冲正时，仅退回本次订单对应的 IC 卡实扣金额。 |

### 4.5 系统管理配置与设备控制规则

**A. 远程控制**

| 编号 | 规则 |
|------|------|
| 4.5-01 | 系统管理员可在系统管理端对在线设备发起远程关机、重启和放水。 |
| 4.5-02 | **条件：** 设备处于离线状态。<br>**操作：** 系统拒绝执行指令。<br>**结果：** 系统提示设备离线，无法执行；控制记录中生成一条失败记录（失败原因：设备离线）。 |
| 4.5-03 | **条件：** 系统管理员发起远程放水。<br>**操作：** 系统要求选择水类型（纯水/矿化水）和输入放水额度，单位为 L，最高 65L。<br>**结果：** 水类型和额度校验通过后允许提交，校验失败时阻断提交。远程放水为控制指令，不生成取水订单。 |
| 4.5-04 | **条件：** 远程控制指令执行成功。<br>**操作：** 系统展示成功结果。<br>**结果：** 系统管理员可确认本次操作完成。 |
| 4.5-05 | **条件：** 远程控制指令执行失败。<br>**操作：** 系统展示失败结果。<br>**结果：** 系统管理员可手动重新发起操作。 |
| 4.5-06 | **条件：** 远程放水指令提交后返回执行结果。<br>**操作：** 系统生成远程放水记录，并将执行结果写入设备管理记录和系统留痕。<br>**结果：** 远程放水过程可追溯，且不生成订单。 |
| 4.5-07 | 设备运行状态、售水状态、远程控制指令、消费流程、IC卡余额同步、离线处理与异常告警的详细规则见 5.6。 |

**B. 套餐配置**

| 编号 | 规则 |
|------|------|
| 4.5-08 | 系统管理员可配置全平台通用购水套餐，配置项至少包含套餐价格、赠送金额（可选）、上架销售开始时间和上架销售结束时间。每个套餐创建时系统自动生成唯一套餐 ID（PKG-001 格式，3 位自增序号），用于区分同名套餐、列表筛选和订单关联查询。 |
| 4.5-09 | 套餐上架销售时间精确到秒。仅状态为"在售中"的套餐可展示和购买；管理员手动下架的套餐即使在时间范围内也不展示。状态自动流转规则：手动上架后，开始时间到达自动变为"在售中"；结束时间到达自动变为"已结束"。 |
| 4.5-10 | **条件：** 系统管理员保存套餐配置。<br>**操作：** 系统校验是否存在价格+取水额度+上架开始时间+上架结束时间完全相同的"在售中"或"待上架"套餐。<br>**结果：** 如存在，阻断保存并提示冲突套餐 ID 和名称。不同套餐的上架时间段允许重叠。编辑已有套餐后保存时，按编辑后的最终值做全量冲突检查。 |
| 4.5-11 | ~~已废弃。~~ 原"取水额度单价"概念已随双水类型改造移除。套餐定价现为金额制（套餐金额+赠送金额），取水单价按水类型独立配置（纯水单价/矿化水单价），配置在系统配置页面（W23）。 |

**套餐状态定义与操作权限**

套餐分为五种状态，编辑保存与上架为独立操作：

| 状态 | 触发条件 | C 端可见 | 编辑 | 上架 | 下架 |
|------|---------|---------|------|------|------|
| 草稿 | 新建或编辑保存后 | 否 | 可 | 可 | — |
| 待上架 | 手动上架后，开始时间未到 | 否 | 可 | — | 可 |
| 在售中 | 开始时间到达（自动） | 是 | 禁用 | — | 可 |
| 已下架 | 管理员手动下架 | 否 | 可 | 可 | — |
| 已结束 | 结束时间到达（自动） | 否 | 可 | 可 | — |

**状态流转：** 编辑保存→草稿→手动上架→系统判断开始时间（已到→在售中，未到→待上架）→已结束。已下架和已结束通过编辑保存回到草稿，再手动上架重新进入销售流程。时间段已过期时，上架按钮提示先编辑新时间段。
| 4.5-12 | **条件：** 用户已购买套餐。<br>**操作：** 系统将套餐沉淀为用户取水额度。<br>**结果：** 已获得取水额度不随后续套餐价格调整而变化，不设有效期；额度用完后再次购买时，按购买时状态为"在售中"的全平台通用套餐价格结算。 |

**C. 设备取水配置**

| 编号 | 规则 |
|------|------|
| 4.5-13 | 系统管理员可在设备管理中为单台设备配置取水档位，在系统配置页面（W23）配置纯水单价和矿化水单价；取水档位决定柜机待机页可展示的预设水量，水类型单价用于单次取水、IC 卡消费和实付补差计算。纯水单价和矿化水单价为全局统一配置，所有设备共用。 |
| 4.5-14 | **条件：** 系统管理员配置设备取水档位。<br>**操作：** 系统保存该设备已启用取水档位。<br>**结果：** 柜机仅展示当前设备已启用取水档位。 |
| 4.5-15 | **条件：** 系统管理员未为设备配置取水档位或未配置纯水单价或未配置矿化水单价。<br>**操作：** 系统不允许设备进入可售水状态。<br>**结果：** 柜机不展示取水档位，系统管理端提示需完成取水档位与纯水单价、矿化水单价配置。 |

### 4.6 工单协同规则（P2 预留）

工单协同的业务规则、状态流转、流程定义与流程图统一见 §5.8 运维工单流程，此处不重复。

> 原 §4.7 仓储与设备流转规则已合并至 §5.9。

### 4.7 内容触达与多语言规则（P2 预留）

本节保留业务逻辑定义，不纳入当前 P1 / MVP 目标、流程与验收。

**公告管理**

- 公告支持立即发布、定时发布和下架。
- 公告与内容由系统管理员统一管理，由系统后端按目标终端下发。

**触达规则**

- 内容触达按终端角色区分，不做复杂投放体系。
- 柜机端下架后不再展示公告。
- 用户端和机主端对已送达公告保留历史查看能力。
- C 端与柜机支持中、英、日、泰、韩、俄。
- 机主端支持中、泰、英。
- 运维端支持中文和泰文。
- 系统管理端固定中文，不提供语言切换入口。
- 公告与内容触达不影响核心交易流程。
- 多语言以基础可用为目标，资源缺失时按默认语言回退。

## 5. 核心业务流程

说明：

- 以下流程图仅用于表达产品视角下的业务流转关系。
- 流程图不承载接口调用、字段定义、内部状态机和实现细节。
- 若流程图与正文出现冲突，应以正文规则描述为准。

### 5.1 用户取水流程

本节覆盖柜机端直接取水和 C 端扫码取水两种场景，涉及用户、柜机端、C 端、系统后端四个参与方。柜机端流程（5.1.1-5.1.4）描述用户在柜机屏幕上的完整取水闭环；跨端协同规则（5.1.5-5.1.7）描述柜机端与 C 端之间的状态同步和并发控制；C 端扫码取水流程（5.1.8-5.1.12）描述用户通过 LINE 扫描柜机二维码在手机端完成取水的完整闭环。异常订单与售后处理见 §5.3。

#### 5.1.1 柜机端取水主流程

**流程目标**
完成用户从柜机待机页选择取水档位、选择支付方式、完成支付或补差支付、进入柜机支付成功提示，到后续出水与结果确认的完整取水闭环。

**触发条件**  
用户在柜机待机页选择取水档位和水类型。

**参与角色与对象**  
用户、柜机端、C 端、系统后端。

**前置条件**

- 设备处于可售水状态。
- 设备已配置取水档位、纯水单价和矿化水单价。
- 柜机已同步本期可用的取水档位、纯水单价、矿化水单价和基础配置。
- 支付方式与权益规则已具备可用条件。

**主流程**

1. 用户在柜机待机页选择取水档位和水类型（纯水/矿化水）。
2. 系统按水类型单价和档位水量计算取水档位金额。
3. 系统生成取水订单并写入订单模块。
4. 柜机进入支付方式页，展示全部支付方式（IC 卡、LINE Pay、Alipay、WeChat Pay）。设备离线时不可售水，不进入支付流程（见 §4.2）。
5. 用户选择支付方式（以下按支付方式分路径描述）。
6. 用户选择 IC 卡并刷卡（异常处理见 5.1.2 表格）。
7. 系统校验 IC 卡状态、金额与余额，完成扣款或触发补差（见 5.1.2 表格）。
8. 用户选择 LINE Pay，扫码登录小程序。
9. 系统校验套餐，用户在小程序完成支付或补差（见 5.1.2 表格）。
10. 用户选择 Alipay 或 WeChat Pay 扫码支付（失败/取消/超时返回支付方式页）。
11. 用户放入水桶并点击开始取水（柜机屏幕按钮或绿色实体按钮），柜机进入出水页。
12. 出水结束，系统判断取水结果；正常则完成，异常则转入 §5.3。

#### 5.1.2 柜机端关键分支与异常

**关键分支**

| # | 条件/场景 | 处理行为 | 跳转目标 |
|---|-----------|----------|----------|
| 1 | 支付方式选择、权益结算、IC 卡补差与退款口径 | 以 §4.2、§4.3、§4.4 为准 | （全局规则，无页面跳转） |
| 2 | IC 卡刷卡异常（卡不可用或未识别） | 展示刷卡异常页，可重试或返回 | 刷卡提示页 / 支付方式页 |
| 3 | LINE Pay 路径：扫码登录成功后校验套餐 | 展示登录成功页、订单摘要、3 分钟倒计时；在小程序完成支付 | 支付成功页 |
| 4 | LINE Pay 路径：登录超时或倒计时超时 | 返回登录二维码页 | 登录二维码页 |
| 5 | IC 卡路径：不校验用户套餐 | 消费金额按水类型单价和档位水量计算 | （规则说明，无页面跳转） |
| 6 | IC 卡余额不足 | 展示补差二维码页（LINE Pay/Alipay/WeChat Pay） | 补差二维码页 |
| 7 | Alipay/WeChat Pay 路径：不校验套餐，不支持套餐抵扣 | 直接扫码支付；失败/取消/超时返回支付方式页 | 支付方式页 |
| 8 | 套餐足额覆盖订单金额 | 用户仍需在小程序点击支付确认 | 支付成功页 |
| 9 | 所有支付路径成功 | 柜机进入支付成功页，展示订单摘要和支付方式，提示"支付成功，请放好水桶" | 支付成功页 |
| 10 | 出水结果未正常确认 | 订单进入 §5.3 异常订单与售后流程 | §5.3 |
| 11 | 出水过程中暂停出水 | 展示 3 分钟倒计时；暂停期间订单状态仍为已支付取水中 | 出水页（暂停状态） |
| 12 | 暂停后选择继续/停止；暂停次数上限 10 次 | 继续→出水页；停止→部分出水退款；达上限→暂停按钮不可用 | 出水页 / 取水结果页 |
| 13 | 用户主动停止或暂停超时自动停止 | 按实际出水量退款，订单标记已完成，出水类型标记部分出水 | 取水结果页 |

#### 5.1.3 柜机端流程结果

**流程结果**

| # | 场景 | 结果 | 后续动作 |
|---|------|------|----------|
| 1 | 正常完成支付 | 订单写入，进入取水流程 | 出水页 |
| 2 | IC 卡刷卡异常 | 返回刷卡异常页 | 重试或返回支付方式页 |
| 3 | 登录超时或倒计时超时 | 返回登录二维码页 | 重新扫码 |
| 4 | 支付或补差失败 | 返回支付方式页 | 重新选择支付方式 |
| 5 | 支付成功 | 进入柜机支付成功页，展示订单摘要和支付方式 | 放桶取水 |
| 6 | 用户确认后 | 进入柜机出水页，展示已出水量和进度条 | 出水 |
| 7 | 超时未取水 | 取消订单 | 按原扣减来源返还或退款 |
| 8 | 用户停止/暂停超时 | 部分出水退款，订单标记已完成，标记部分出水 | 取水结果页 |
| 9 | 结果异常 | 转入后续处理 | 见 §5.3 |

> 取水订单写入订单模块后，随支付、出水、取消、异常和售后处理持续更新。

#### 5.1.4 柜机端取水业务流程图

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    %% 注：图中"开始取水""暂停出水""继续出水"涵盖柜机屏幕、柜机实体按钮和C端小程序三种触发方式
    A["用户选择取水档位"] --> A0["用户选择水类型（纯水/矿化水）"] --> A1["系统按水类型单价计算取水档位金额"]
    A1 --> A2["生成取水订单并写入订单模块"]
    A2 --> A3{"设备是否在线"}
    A3 -->|"是"| B["柜机进入支付方式页"]
    A3 -->|"否"| A4["设备异常，订单自动取消"]:::error
    A4 --> A5["返回待机页"]
    B --> C{"支付方式"}
    C -->|"IC 卡"| D["柜机展示 IC 卡刷卡提示页"]
    D --> E["用户刷卡"]
    E --> E1{"刷卡是否成功"}
    E1 -->|"卡不可用或未识别"| E2["柜机展示刷卡异常页"]
    E2 --> E3{"用户选择"}
    E3 -->|"重试刷卡"| D
    E3 -->|"返回支付方式"| B
    E1 -->|"成功"| F["系统校验 IC 卡状态、档位金额与卡余额"]
    F --> F1{"IC 卡状态是否可用"}
    F1 -->|"否"| M["提示原因并返回支付方式页"]
    F1 -->|"是"| G{"余额是否满足档位金额"}
    G -->|"是"| H["完成 IC 卡扣款"]
    G -->|"否"| J["柜机展示补差二维码页（LINE Pay/Alipay/WeChat Pay）"]
    J --> K["用户选择扫码方式完成补差支付"]
    K --> L["柜机展示支付成功页并提示放好水桶"]
    H --> L
    C -->|"LINE Pay"| N["柜机展示登录二维码页"]
    N --> O["用户扫码登录小程序"]
    O --> O1{"登录是否成功"}
    O1 -->|"是"| O2["柜机提示登录成功，展示订单摘要和3分钟倒计时"]
    O1 -->|"否"| N
    O2 --> P["系统自动校验套餐"]
    O2 -->|"倒计时超时"| N
    P --> Q["小程序展示结算结果与应付金额"]
    Q --> R{"套餐是否足额覆盖"}
    R -->|"是"| S["用户在小程序点击支付"]
    R -->|"否"| T["用户在小程序完成补差支付"]
    S --> U{"支付是否成功"}
    T --> U
    U -->|"是"| L
    U -->|"否"| M
    C -->|"Alipay"| AW1["柜机展示 Alipay 扫码支付二维码页"]
    C -->|"WeChat Pay"| AW1
    AW1 --> AW2["用户使用对应支付 App 扫码支付"]
    AW2 --> AW3{"支付是否成功"}
    AW3 -->|"是"| L
    AW3 -->|"否"| M
    L --> V["用户放入水桶并点击开始取水（柜机屏幕按钮/绿色实体按钮）"]
    V --> W{"是否超时未取水"}
    W -->|"是"| X["取消订单并按原扣减来源返还或退款"]
    W -->|"否"| Y["柜机出水页展示订单摘要、支付方式、已出水量和进度条"]
    Y --> Y1{"用户操作"}
    Y1 -->|"继续出水"| Y2{"出水是否完成"}
    Y2 -->|"是"| Z["系统后端确认取水结果"]
    Y2 -->|"否"| Y
    Y1 -->|"暂停出水"| Y3["暂停出水，展示暂停状态和3分钟倒计时"]
    Y3 --> Y4{"用户选择"}
    Y4 -->|"继续出水"| Y
    Y4 -->|"停止出水"| Y5["柜机停止出水，触发部分出水退款"]
    Y3 -->|"倒计时超时"| Y5
    Y3 -->|"暂停次数达10次"| Y
    Y5 --> Y6["系统按实际出水量计算退款"]
    Y6 --> Y7["订单状态更新为已完成，标记部分出水"]
    Y7 --> AB["完成"]
    Z --> AA{"结果是否正常"}
    AA -->|"是"| AB["正常完成"]
    AA -->|"否"| AC["进入 5.3 异常订单与售后流程"]
```

#### 5.1.5 柜机端与 C 端页面跳转同步流程图

**柜机端与 C 端取水页面跳转同步流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '16px', 'lineColor': '#64748B'}, 'flowchart': {'rankSpacing': 80, 'nodeSpacing': 50}}}%%
flowchart TD
    classDef kiosk fill:#DBEAFE,stroke:#3B82F6,color:#1E40AF,stroke-width:2px,font-size:16px;
    classDef cend fill:#D1FAE5,stroke:#10B981,color:#065F46,stroke-width:2px,font-size:16px;
    classDef error fill:#FEE2E2,stroke:#EF4444,color:#991B1B,stroke-width:2px,font-size:16px;
    classDef entry fill:#F3E8FF,stroke:#8B5CF6,color:#5B21B6,stroke-width:2px,font-size:16px;
    %% 注：K08→K09 出水触发涵盖柜机屏幕和绿色实体按钮；K09 暂停/继续涵盖柜机屏幕、柜机实体按钮和C端小程序

    %% ========== 入口 ==========
    K01["K01 待机页 · 选档位+水类型 · 展示取水二维码"]:::entry -->|"用户 LINE 扫码"| C06["C06 选档位+水类型页"]:::cend

    %% ========== 选档位 → 支付（同步跳转）==========
    C06 -->|"选好档位+水类型 · 点击开始取水"| C01["C01 支付页"]:::cend
    K02["K02 支付方式页<br/>已登录: LINE Pay / 套餐 / IC卡"]:::kiosk
    C01 <-.->|"① C端发起<br/>柜机同步跳转"| K02

    %% ========== C端支付路径（左侧）==========
    C01 -->|"LINE Pay"| C01A["C01A LINE Pay 支付中"]:::cend
    C01 -->|"套餐额度足够"| C01B["C01B 套餐确认"]:::cend
    C01 -->|"IC卡余额不足<br/>触发补差"| C01C["C01C 套餐+LINE Pay 补差"]:::cend

    %% ========== 柜机支付路径（右侧）==========
    K02 -->|"IC卡"| K03["K03 IC卡刷卡页"]:::kiosk
    K03 -->|"余额不足"| K07["K07 补差二维码页"]:::kiosk
    K02 -->|"LINE Pay"| K02A["K02A LINE Pay 支付确认"]:::kiosk
    K02 -->|"微信 / 支付宝"| K12["K12 扫码支付页"]:::kiosk

    %% ========== 补差同步 ==========
    K07 <-.->|"② IC卡余额不足<br/>C端同步刷新补差"| C01C

    %% ========== 支付成功 ==========
    C01A --> C09["C09 放桶倒计时 · 5分钟"]:::cend
    C01B --> C09
    C01C -->|"补差成功"| C09

    K03 -->|"全额支付成功"| K08["K08 放桶倒计时 · 5分钟"]:::kiosk
    K02A --> K08
    K07 -->|"C端补差成功"| K08
    K12 --> K08

    %% ========== 先到先得 + 放桶倒计时同步 ==========
    C09 <-.->|"③ 先到先得"| K08
    C09 <-.->|"④ 放桶倒计时同步"| K08

    %% ========== 出水（实时同步）==========
    C09 -->|"开始取水"| C07["C07 出水页"]:::cend
    K08 -->|"开始取水（柜机屏幕/实体按钮）"| K09["K09 出水页"]:::kiosk

    C07 <-.->|"⑤ 出水实时双向同步"| K09

    %% ========== 结果（数据一致）==========
    C07 -->|"出水完成"| C08["C08 取水结果页<br/>完整 / 部分 / 失败"]:::cend
    K09 -->|"出水完成"| K10["K10 取水结果页<br/>完整 / 部分 / 失败"]:::kiosk

    C08 <-.->|"⑥ 取水结果数据一致"| K10

    %% ========== 取消与异常 ==========
    C10["C10 订单已取消页<br/>超时 / 主动 / 设备异常"]:::error
    K11["K11 订单已取消页"]:::error
    C10 <-.->|"⑦ 取消异常两端同步"| K11

    C09 -->|"放桶超时"| C10
    K08 -->|"放桶超时"| K11
    C01 -->|"用户取消 / 设备异常"| C10
    C06 -->|"用户取消"| C10
    K08 -->|"设备异常"| K11
    C07 -->|"设备故障"| C08
    K09 -->|"设备故障"| K10

    %% ========== 返回首页 ==========
    C08 -->|"返回"| C00["C00 首页"]:::cend
    C10 -->|"30s 倒计时返回"| C00
    K10 -->|"返回"| K01
    K11 -->|"返回"| K01
```

#### 5.1.6 跨端协同规则

> 本节规则由原文柜机端关键分支和 C 端关键分支中涉及两端交互的规则合并去重而成。

| # | 规则 | 说明 | 涉及场景 |
|---|------|------|----------|
| 1 | 支付先到先得 | 一方发起支付后另一方等待；一方成功后另一方跳转取消页。支付请求包含水类型和金额信息 | 支付阶段 |
| 2 | 多用户扫码互斥 | 同一时间多用户扫同一柜机取水码，仅第一个扫码登录成功的用户可取水，其他用户提示"设备忙" | 扫码入口 |
| 3 | 设备异常同步取消 | 设备状态变为离线/维护/忙碌时，两端同步取消订单，跳转取消页 | 全流程 |
| 4 | 水类型同步 | C 端选择水类型后，柜机端同步展示对应水类型和价格；出水结果展示包含水类型信息 | 选档位/出水结果 |
| 5 | 放桶倒计时同步 | C 端与柜机端共享同一放桶倒计时，超时两端同步取消并退款 | 支付成功后 |
| 6 | IC 卡余额不足补差同步 | 柜机端 IC 卡余额不足时，C 端支付页同步刷新到补差场景（套餐 + LINE Pay 补差） | IC 卡补差 |
| 7 | 同一用户并发控制 | 同一用户同一时间只允许一个取水订单，跨设备亦然 | 全流程 |

#### 5.1.7 柜机端角色时序图

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor U as 用户
    participant K as 柜机端
    participant C as C端
    participant S as 系统后端

    U->>K: 选择取水档位
    K->>S: 按水类型单价和档位水量计算取水档位金额
    S-->>K: 返回取水档位金额
    S->>S: 生成取水订单并写入订单模块
    K-->>U: 展示支付方式页

    alt IC 卡路径
        U->>K: 选择 IC 卡
        K-->>U: 展示 IC 卡刷卡提示页
        U->>K: 刷卡
        alt 卡不可用或未识别
            K-->>U: 展示刷卡异常页
            alt 用户选择重试
                U->>K: 重试刷卡
            else 用户选择返回
                U->>K: 返回支付方式页
            end
        else 刷卡成功
            K->>S: 校验 IC 卡状态、取水档位金额与卡余额
            alt 卡状态不可用
                S-->>K: 返回不可消费并返回支付方式页
            else 余额满足档位金额
                S-->>K: 返回 IC 卡支付成功
            else 余额不足且支持扫码补差
                alt 卡内余额大于 0
                    S->>S: 冻结卡内可用金额
                else 卡内余额等于 0
                    S->>S: 不冻结金额
                end
                K-->>U: 展示补差二维码页（LINE Pay/Alipay/WeChat Pay）
                U->>C: 选择扫码方式并完成补差支付
                C->>S: 发起扫码补差支付
                alt 补差成功
                    S-->>K: 返回支付成功
                else 补差失败、取消或超时
                    S->>S: 释放已形成的冻结金额
                    S-->>K: 返回支付方式页
                end
            else 余额不足且不支持补差
                S-->>K: 返回支付方式页
            end
        end
    else LINE Pay 路径
        U->>K: 选择 LINE Pay
        K-->>U: 展示登录二维码页
        U->>C: 扫码登录小程序
        C->>S: 提交登录状态
        alt 登录成功
            K-->>U: 展示登录成功页，展示订单摘要和3分钟倒计时
            S->>S: 自动校验套餐
            S-->>C: 返回结算结果与应付金额
            alt 权益足额覆盖
                U->>C: 点击支付完成结算确认
                C->>S: 提交支付结果
            else 权益不足
                U->>C: 完成补差支付
                C->>S: 发起 LINE Pay 支付
            end
            alt 支付成功
                S-->>K: 返回支付成功
            else 支付超时或支付失败
                S-->>K: 返回支付方式页
            end
        else 登录超时
            S-->>K: 返回登录二维码页
        end
    else Alipay / WeChat Pay 路径
        U->>K: 选择 Alipay 或 WeChat Pay
        K-->>U: 展示对应支付渠道的扫码支付二维码页，展示订单摘要和应付金额
        U->>U: 使用对应支付 App 扫码
        alt 支付成功
            S-->>K: 返回支付成功
        else 支付失败、取消或超时
            S-->>K: 返回支付方式页
        end
    end

    opt 已展示支付成功页
        K-->>U: 展示支付成功页，展示订单摘要和支付方式，提示放好水桶
        alt 超时未取水
            K->>S: 触发取消与返还或退款
            S->>S: 处理权益原路返还与实付原路退款
            S-->>K: 返回取消结果
            K-->>U: 展示取消或处理结果
        else 用户放入水桶并点击开始取水（柜机屏幕按钮或绿色实体按钮）
            U->>K: 点击开始取水
            Note over U,K: 实体按钮由水机板执行，状态上报主控板同步屏幕
            K-->>U: 展示出水页，展示订单摘要、支付方式、已出水量和进度条
            K->>S: 开始取水并回传结果
            loop 出水过程中
                alt 用户触发暂停出水（柜机屏幕/柜机实体按钮/C端小程序）
                    U->>K: 暂停出水
                    K-->>U: 展示暂停状态和3分钟倒计时
                    alt 用户触发继续出水（柜机屏幕/柜机实体按钮/C端小程序）
                        U->>K: 继续出水
                        K->>S: 继续出水
                    else 用户点击停止出水
                        U->>K: 停止出水
                        K->>S: 触发部分出水退款
                        S->>S: 按实际出水量重新计算应扣权益和应付金额
                        S->>S: 权益优先回退，实付后退
                        S-->>K: 返回退款结果
                        K-->>U: 展示退款结果
                    else 倒计时超时
                        K->>S: 触发部分出水退款
                        S->>S: 按实际出水量重新计算应扣权益和应付金额
                        S->>S: 权益优先回退，实付后退
                        S-->>K: 返回退款结果
                        K-->>U: 展示退款结果
                    end
                end
            end
            alt 出水完成
                S-->>K: 返回完成结果
                K-->>U: 展示正常完成
            else 结果待确认（22 指令未到达）
                S-->>K: 返回出水结果确认中
                K-->>U: 展示出水结果确认中
                Note over S,K: 系统按 §5.6.5 五种情况自动处理，20 分钟超时后自动结算
            end
        end
    end
```

#### 5.1.8 C 端扫码取水主流程

**C 端扫码取水流程**

**流程目标**  
完成用户通过 LINE 扫描柜机取水二维码，在 C 端小程序内选档位、支付、出水确认的完整取水闭环。与柜机端取水流程统一，交互适配手机端。

**触发条件**  
用户通过 LINE 扫描柜机屏幕上的取水二维码。

**参与角色与对象**  
用户、C 端、柜机端、系统后端。

**前置条件**

- 设备处于正常可售水状态。
- 设备已配置取水档位、纯水单价和矿化水单价。
- 取水二维码有效（未过期，5 分钟内）。
- 用户已登录 LINE。

**主流程**

1. 用户 LINE 扫描柜机取水二维码，系统校验二维码有效性、设备状态、用户登录状态和进行中订单。
2. 校验通过后进入选档位页面，展示设备信息、档位和价格。
3. 用户选择取水档位和水类型，系统计算金额并生成取水订单；C 端点击开始取水后柜机同步跳转到支付方式页。
4. 系统根据用户类型和套餐情况进入支付环节（详见 5.1.9 表格）。
5. C 端扫码取水仅支持 LINE Pay 和套餐支付，不支持微信支付和支付宝。
6. 支付成功后进入出水页面，柜机屏幕同步显示。
7. 出水两端均可触发、暂停、停止、实时同步；暂停 3 分钟倒计时，上限 10 次。
8. 出水完成后 C 端展示取水结果页。
9. 首页"进行中取水"卡片在取水完成后自动消失。

#### 5.1.9 C 端扫码取水关键分支与异常

**关键分支**

| # | 条件/场景 | 处理行为 | 跳转目标 |
|---|-----------|----------|----------|
| 1 | 取水二维码过期（5 分钟） | 提示"二维码已过期，请重新扫描" | 扫码页 |
| 2 | 设备忙碌 | 提示"设备忙，存在其他订单，请稍后再试" | 首页 |
| 3 | 设备离线 | 提示"设备当前不可用，请稍后再试" | 首页 |
| 4 | 设备维护或不可售水 | 提示"设备当前不可取水，请稍后再试" | 首页 |
| 5 | 用户已有进行中的取水订单 | 提示"您有进行中取水订单，请先完成"，展示进行中订单信息 | 首页 |
| 6 | IC 卡用户在 C 端发起取水 | 提示"IC 卡用户请在柜机端取水" | 首页 |
| 7 | 选档位后 5 分钟内未完成支付 | 系统自动取消流程，设备释放 | 首页 |
| 8 | 取水流程中设备状态变化（离线/维护） | 系统自动取消流程并提示 | 订单已取消页 |
| 9 | 用户每步均可取消 | 取消后设备释放 | 小程序首页 |
| 10 | 出水过程中用户退出 C 端页面 | 柜机端继续出水不受影响；用户可通过首页"进行中取水"卡片返回 | 首页进行中卡片 |
| 11 | 远程代付场景 | 订单归属支付人，退款原路退回支付人 | （规则说明，无页面跳转） |
| 12 | 支付成功后柜机出水失败 | 系统自动发起退款 | 取水结果页 |

> 注：出水过程中暂停/停止/超时规则、出水过程中断（含设备故障）、同一用户并发控制、C 端操作期间柜机屏幕同步等跨端规则已纳入 §5.1.6，此处不重复列出。

#### 5.1.10 C 端扫码取水流程结果

**流程结果**

| # | 场景 | 结果 | 后续动作 |
|---|------|------|----------|
| 1 | 订单生成 | 取水订单写入订单模块，订单号 DR 前缀，不区分取水来源 | — |
| 2 | 正常完成支付 | 进入取水流程 | 出水页 |
| 3 | 设备状态异常 | 取消流程并提示用户 | 订单已取消页 |
| 4 | 超时取消 | 释放设备 | 订单已取消页 |
| 5 | 用户主动取消 | 释放设备 | 小程序首页 |
| 6 | 出水完成 | 展示核心结果信息 | 取水结果页 |
| 7 | 出水异常 | 与柜机端一致进入后续处理 | 见 §5.3 |
| 8 | 设备故障（出水过程中） | 自动退款 | 取水结果页 |

> 第 8 行"设备故障"由 C 端关键分支（出水过程中断…设备故障）推导，原文流程结果部分未单独列出。

#### 5.1.11 C 端扫码取水业务流程图

**C 端扫码取水业务流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    classDef error fill:#FEE2E2,stroke:#EF4444,color:#991B1B,stroke-width:1px;
    classDef success fill:#D1FAE5,stroke:#10B981,color:#065F46,stroke-width:1px;

    A["用户使用 LINE 扫描柜机取水二维码"] --> B{"校验二维码有效性"}
    B -->|"过期"| B1["提示：二维码已过期，请重新扫描"]:::error
    B -->|"有效"| C{"校验设备状态"}
    C -->|"忙碌"| C1["提示：设备忙，请稍后再试"]:::error
    C -->|"离线"| C2["提示：设备不可用，请稍后再试"]:::error
    C -->|"维护/不可售水"| C3["提示：设备不可取水，请稍后再试"]:::error
    C -->|"正常"| D{"校验用户登录状态"}
    D -->|"未登录"| D1["提示用户登录 LINE"]
    D1 --> D
    D -->|"已登录"| E{"校验进行中取水订单"}
    E -->|"已有进行中订单"| E1["提示：您有进行中取水订单，请先完成"]:::error
    E -->|"无进行中订单"| F["C 端选档位页面"]
    F --> G["用户选择取水档位"]
    G --> H["系统计算取水档位金额，生成取水订单"]
    H --> I{"用户类型与套餐情况"}
    I -->|"套餐额度足够"| J["展示套餐抵扣确认页"]
    J --> J1["用户确认"]
    I -->|"套餐额度不足"| K["展示支付页（套餐+LINE Pay 补差）"]
    K --> K1["用户完成补差支付"]
    I -->|"非套餐用户"| L["展示支付页（LINE Pay）"]
    L --> L1["用户完成支付"]
    J1 --> M{"支付/确认是否成功"}
    K1 --> M
    L1 --> M
    M -->|"否"| N["返回支付页或首页"]:::error
    M -->|"是"| O["C 端出水页面"]
    O --> P{"用户操作"}
    P -->|"继续出水"| Q{"出水是否完成"}
    Q -->|"是"| R["C 端取水结果页"]:::success
    Q -->|"否"| O
    P -->|"暂停出水"| S["暂停状态 + 3 分钟倒计时"]
    S --> T{"用户选择"}
    T -->|"继续出水"| O
    T -->|"停止出水"| U["停止出水，触发部分出水退款"]
    S -->|"倒计时超时"| U
    S -->|"暂停次数达上限"| O
    U --> R
    P -->|"停止出水（二次确认）"| U
    P -->|"退出页面"| V["柜机继续出水不受影响"]
    V --> W["用户可通过首页进行中卡片返回"]
```


#### 5.1.12 C 端扫码取水角色时序图

**C 端扫码取水角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor U as 用户
    participant C as C端
    participant K as 柜机端
    participant S as 系统后端

    U->>C: LINE 扫描柜机取水二维码
    C->>S: 校验二维码有效性、设备状态、用户登录状态、进行中订单
    alt 校验不通过
        S-->>C: 返回校验失败原因
        C-->>U: 提示相应错误信息
    else 校验通过
        S-->>C: 返回设备信息、取水档位、套餐信息
        C-->>U: 展示选档位页面（位置信息+档位+价格+套餐余额）
        K-->>K: 同步显示 C 端操作状态
        U->>C: 选择取水档位
        C->>S: 计算取水档位金额，生成取水订单
        S->>S: 写入订单模块
        C->>S: 点击开始取水
        S->>K: 通知柜机同步跳转到支付方式页
        K-->>K: 柜机进入支付方式页（已登录状态）
        alt 套餐额度足够
            C-->>U: 展示套餐抵扣确认页
            U->>C: 确认抵扣
        else 套餐额度不足
            C-->>U: 展示支付页（套餐+LINE Pay 补差）
            U->>C: 完成 LINE Pay 补差支付
            C->>S: 发起 LINE Pay 支付
            S->>K: 通知柜机端等待（C 端已发起支付）
            S-->>C: 返回支付结果
        else 非套餐用户
            C-->>U: 展示支付页（LINE Pay）
            U->>C: 完成 LINE Pay 支付
            C->>S: 发起 LINE Pay 支付
            S->>K: 通知柜机端等待（C 端已发起支付）
            S-->>C: 返回支付结果
        end
        alt 支付成功
            S->>K: 通知柜机端支付成功，同步进入放桶倒计时
            C-->>U: 展示放桶倒计时页面
            K-->>K: 柜机同步进入放桶倒计时页面
            loop 出水过程中
                Note over C,K: 出水实时双向同步（暂停/继续/停止/已出水量/剩余量）
                alt 用户暂停出水
                    U->>C: 暂停出水
                    C->>S: 暂停出水
                    S->>K: 同步暂停出水
                    C-->>U: 展示暂停状态和 3 分钟倒计时
                    alt 用户继续出水
                        U->>C: 继续出水
                        C->>S: 继续出水
                        S->>K: 同步继续出水
                    else 用户停止出水
                        U->>C: 停止出水（二次确认）
                        C->>S: 触发部分出水退款
                        S->>K: 同步停止出水
                        S->>S: 按实际出水量处理退款
                    else 倒计时超时
                        C->>S: 触发部分出水退款
                        S->>K: 同步停止出水
                    end
                else 用户停止出水
                    U->>C: 停止出水（二次确认）
                    C->>S: 触发部分出水退款
                    S->>K: 同步停止出水
                    S->>S: 按实际出水量处理退款
                else 用户退出页面
                    U->>U: 退出 C 端页面
                    Note over K: 柜机端继续出水不受影响
                end
            end
            alt 出水完成
                S-->>C: 返回完成结果
                C-->>U: 展示取水结果页
                S-->>K: 同步展示取水结果
            else 结果异常
                S-->>C: 返回异常处理结果
                C-->>U: 展示异常提示
                S-->>K: 同步展示异常结果
            else 设备异常（离线/维护/故障）
                S-->>C: 通知设备异常，取消订单
                S-->>K: 通知设备异常，取消订单
                C-->>U: 展示订单已取消（文案适配异常原因）
                K-->>K: 跳转订单已取消页
            end
        else 支付失败/取消/超时
            C-->>U: 返回支付页或首页
        end
    end
```

### 5.2 套餐购买流程

**流程目标**  
完成用户通过柜机套餐购买二维码入口或 LINE 小程序入口购买全平台通用购水套餐，并生成取水额度的完整闭环。

**触发条件**  
用户进入套餐购买入口。

**参与角色与对象**  
用户、柜机端、C 端、系统后端。

**前置条件**

- 至少存在状态为"在售中"的全平台通用购水套餐。
- 用户可通过柜机套餐购买二维码入口或 LINE 小程序入口进入购买流程。
- 支付能力处于可用状态。

**主流程**

1. 用户通过柜机套餐购买二维码入口或 LINE 小程序入口进入套餐购买流程。
2. 系统查询当前状态为"在售中"的全平台通用购水套餐。
3. 系统向用户展示可购买套餐列表、套餐价格和取水额度。
4. 用户选择套餐并确认购买。
5. 系统生成本次套餐购买订单，并纳入订单模块。
6. 系统生成本次套餐购买应付金额。
7. 用户完成支付。
8. 支付成功后，系统生成对应取水额度。
9. 系统将购买结果同步给用户，用户可查看剩余取水额度。
10. 若支付失败、取消或超时，则关闭本次套餐购买订单，用户可重新发起购买。

**关键分支**

- 柜机套餐购买二维码仅作为购买入口，不改变套餐价格口径。
- LINE 小程序入口与柜机套餐购买二维码入口使用同一套全平台通用套餐价格。
- 仅状态为"在售中"的套餐可展示和购买；管理员手动下架的套餐即使在时间范围内也不展示。
- 支付过程中套餐被管理员下架，不影响当前进行中的支付，用户可正常完成支付。
- 套餐购买订单纳入订单模块，与取水订单分开处理。
- 购买成功后生成的取水额度（泰铢）全平台通用，不受水类型单价变化影响。
- 套餐退款规则见 4.3-C 和 7.2 节。用户购买套餐前可在套餐购买页（C05）查看退款规则说明。

**流程结果**

- 套餐购买订单纳入订单模块，并与取水订单分开统计和处理。
- 用户完成套餐购买并获得对应取水额度。
- 支付失败、取消或超时时，本次套餐购买订单关闭，不生成取水额度。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["用户进入套餐购买入口"] --> B{"入口类型"}
    B -->|"柜机套餐购买二维码"| C["扫码进入 LINE 小程序套餐页"]
    B -->|"LINE 小程序"| D["直接进入套餐购买页"]
    C --> E["系统查询当前在售全平台通用套餐"]
    D --> E
    E --> F["展示套餐列表、套餐价格和取水额度"]
    F --> G["用户选择套餐并确认购买"]
    G --> H["生成套餐购买订单并纳入订单模块"]
    H --> I["计算应付金额"]
    I --> J["用户完成支付"]
    J --> K{"支付是否成功"}
    K -->|"是"| L["生成对应取水额度"]
    L --> M["用户查看购买结果与剩余取水额度"]
    K -->|"否"| N["关闭本次购买订单，用户可重新购买"]
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor U as 用户
    participant K as 柜机端
    participant C as C端
    participant S as 系统后端

    alt 柜机套餐购买二维码入口
        U->>K: 扫描套餐购买二维码
        K-->>U: 引导进入 LINE 小程序套餐页
        U->>C: 进入套餐购买页
    else LINE 小程序入口
        U->>C: 进入套餐购买页
    end

    C->>S: 查询当前在售全平台通用套餐
    S-->>C: 返回套餐列表、套餐价格和取水额度
    U->>C: 选择套餐并确认购买
    C->>S: 发起套餐购买
    S->>S: 生成套餐购买订单并纳入订单模块
    S->>S: 计算应付金额
    S-->>C: 返回应付金额
    U->>C: 确认支付
    C->>S: 提交支付结果
    alt 支付成功
        S->>S: 生成对应取水额度
        S-->>C: 返回购买成功与剩余取水额度
        C-->>U: 展示购买结果
    else 支付失败、取消或超时
        S->>S: 关闭本次套餐购买订单
        S-->>C: 返回购买失败或关闭结果
        C-->>U: 展示失败或关闭结果
    end
```

### 5.3 异常订单与售后流程

**流程目标**  
对终值缺失、少出水、退款异常以及后台人工售后场景提供统一、清晰、可追溯的处理路径。

**触发条件**  
取水订单结果未正常闭环、退款未正常完成，或系统管理员对已结束的取水订单发起人工售后。

**参与角色与对象**  
系统管理员、系统后端、C 端用户。

**前置条件**

- 已存在本次取水订单。
- 订单已进入结果确认、售后或退款处理阶段，或订单状态为已完成、已取消并允许发起人工售后。

本流程由系统后端自动处理、系统管理员人工售后和补救处理共同完成。

**主流程**

1. 系统后端识别订单结果异常或退款结果异常，或系统管理员对已结束的取水订单发起人工售后。
2. 系统判断触发来源，并区分系统自动处理与系统管理员人工售后。
3. 若为系统自动处理，则系统继续判断异常类型，并区分终值缺失、少出水（含用户主动停止和暂停超时）、退款异常等场景。
4. 若为终值缺失，则先进入异常排查，并持续等待结果或由系统管理员介入确认。
5. 若为少出水，则系统后端自动进入售后处理，并确认实际出水量。
6. 系统按实际出水量重新计算本次订单最终应扣权益和最终应付金额。
7. 若订单存在套餐额度扣减，则系统仅保留实际出水量对应的套餐额度扣减，并将差额套餐额度回退至用户套餐余额。
8. 若订单存在实付金额，则系统按原支付路径退回多收实付金额。
9. 若为退款异常，则系统后端优先执行自动处理。
10. 若为系统管理员人工售后，则系统先校验订单类型、订单状态和是否已存在售后单；校验通过后生成售后单并进入审批。
11. 审批通过后，系统按售后类型执行部分退款、退额度或全额退款；审批未通过则结束本次人工售后。
12. 若任一步骤自动处理或人工售后执行未成功，则系统管理员进入补救处理。
13. 系统后端更新订单最终处理结果、售后单状态，并同步用户可见结果。
14. 用户可查看最终结果。

**关键分支**

- 终值缺失、少出水（含用户主动停止和暂停超时）、退款异常的处理口径以 4.3 权益抵扣与退款规则为准。
- 人工售后仅适用于已完成或已取消的取水订单。套餐购买订单的退款由系统自动处理（见 7.2 节套餐退款业务规则），不进入人工审核流程。IC 卡充值订单不进入本流程。
- 同一取水订单在 P1 / MVP 阶段仅允许 1 笔售后单。
- 晚到结果回传后，系统应按最终结果补全订单状态。
- 少出水场景必须以实际出水量作为套餐额度最终扣减依据。
- 少出水自动处理不进入人工审批主链路。
- 用户侧仅查看处理结果，不展示内部失败原因和补救细节。

**流程结果**

- 异常排查完成并恢复订单结果。
- 少出水售后完成，并按实际出水量完成套餐额度修正、差额回退和实付退款。
- 退款异常经系统后端自动处理或系统管理员补救后完成闭环。
- 人工售后经审批通过后完成处理，并同步更新售后单状态与订单结果。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["取水订单异常或系统管理员发起人工售后"] --> B{"触发来源"}
    B -->|"系统自动识别"| C{"异常类型"}
    C -->|"终值缺失"| D["进入异常排查"]
    D --> E{"是否确认结果"}
    E -->|"是"| Z["更新订单结果或售后结果"]
    E -->|"否"| Y["继续排查或系统管理员补救"]
    C -->|"少出水"| F["自动进入售后处理并确认实际出水量"]
    F --> G["按实际出水量重新计算最终应扣权益和最终应付金额"]
    G --> H{"是否存在套餐额度扣减"}
    H -->|"是"| I["保留实际出水量对应套餐扣减并回退差额套餐额度"]
    I --> K{"套餐额度回退是否成功"}
    K -->|"是"| J{"是否存在实付金额"}
    K -->|"否"| Y
    H -->|"否"| J{"是否存在实付金额"}
    J -->|"否"| Z
    J -->|"是"| L["按原支付路径退回多收实付金额"]
    L --> M{"退款是否成功"}
    M -->|"是"| Z
    M -->|"否"| Y
    C -->|"退款异常"| N["系统后端优先自动处理"]
    N --> O{"自动处理是否成功"}
    O -->|"是"| Z
    O -->|"否"| Y
    B -->|"系统管理员人工发起"| P["选择已结束的取水订单"]
    P --> Q{"是否允许发起人工售后"}
    Q -->|"否"| R["阻断发起并提示原因"]
    Q -->|"是"| S["生成售后单并进入审批"]
    S --> T{"审批是否通过"}
    T -->|"否"| U["售后单已驳回"]
    T -->|"是"| V{"售后类型"}
    V -->|"部分退款"| W["仅退回实付金额"]
    V -->|"退额度"| X["仅退回套餐取水额度"]
    V -->|"全额退款"| AA["按原扣减来源执行权益回退与实付退款"]
    W --> AB{"执行是否成功"}
    X --> AB
    AA --> AB
    AB -->|"是"| AC["更新售后单状态与订单结果"]
    AB -->|"否"| Y
    Y --> Z
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor U as 用户
    participant C as C端
    participant S as 系统后端
    actor A as 系统管理员

    S->>S: 识别订单结果异常、退款异常或接收人工售后发起

    alt 系统自动识别
        alt 终值缺失
            S->>S: 进入异常排查
            alt 已确认结果
                S->>S: 更新订单最终结果
            else 等待 22 指令（20 分钟超时）
                S-->>C: 同步出水结果确认中
                C-->>U: 展示出水结果确认中
                Note over S,C: 系统按 §5.6.5 自动处理，超时后自动结算
            end
        else 少出水
            S->>S: 自动进入售后处理并确认实际出水量
            S->>S: 按实际出水量重新计算最终应扣权益和最终应付金额
            alt 存在套餐额度扣减
                S->>S: 保留实际出水量对应套餐扣减并回退差额套餐额度
                alt 套餐额度回退成功
                    alt 存在实付金额
                        S->>S: 按原支付路径退回多收实付金额
                        alt 实付退款成功
                            S->>S: 更新订单最终结果
                        else 实付退款失败
                            S-->>A: 转入补救处理
                            A->>S: 发起补救
                            S->>S: 更新订单最终结果
                        end
                    else 不存在实付金额
                        S->>S: 更新订单最终结果
                    end
                else 套餐额度回退失败
                    S-->>A: 转入补救处理
                    A->>S: 发起补救
                    S->>S: 更新订单最终结果
                end
            else 不存在套餐额度扣减
                alt 存在实付金额
                    S->>S: 按原支付路径退回多收实付金额
                    alt 实付退款成功
                        S->>S: 更新订单最终结果
                    else 实付退款失败
                        S-->>A: 转入补救处理
                        A->>S: 发起补救
                        S->>S: 更新订单最终结果
                    end
                else 不存在实付金额
                    S->>S: 更新订单最终结果
                end
            end
        else 退款异常
            S->>S: 优先执行自动处理
            alt 自动处理成功
                S->>S: 更新订单最终结果
            else 自动处理失败
                S-->>A: 转入补救处理
                A->>S: 发起补救
                S->>S: 更新订单最终结果
            end
        end
    else 系统管理员人工发起
        A->>S: 选择已结束的取水订单并发起人工售后
        S->>S: 校验订单类型、订单状态和是否已存在售后单
        alt 允许发起
            S->>S: 生成售后单
            A->>S: 审批售后单
            alt 审批通过
                alt 部分退款
                    S->>S: 仅退回实付金额
                else 退额度
                    S->>S: 仅退回套餐取水额度
                else 全额退款
                    S->>S: 按原扣减来源执行权益回退与实付退款
                end
                alt 执行成功
                    S->>S: 更新售后单状态与订单最终结果
                else 执行失败
                    S-->>A: 转入补救处理
                    A->>S: 发起补救
                    S->>S: 更新售后单状态与订单最终结果
                end
            else 审批驳回
                S->>S: 更新售后单状态为已驳回
            end
        else 不允许发起
            S-->>A: 阻断发起并提示原因
        end
    end

    S-->>C: 同步最终结果
    C-->>U: 展示最终处理结果
```

### 5.4 IC 卡管理流程

**流程目标**  
完成 IC 卡从发卡、充值、消费到状态管理和台账留痕的完整管理闭环。

**触发条件**  
系统管理员发起 IC 卡相关业务动作，或用户在柜机端使用 IC 卡消费。

**参与角色与对象**  
系统管理员、用户、柜机端、C 端、系统后端。

**前置条件**

- 已建立 IC 卡管理能力。
- 系统管理员具备对应操作权限。

本流程用于表达 IC 卡生命周期中的主要业务动作；发卡、充值、消费、状态管理和台账查询为并列主动作，但单张卡必须先完成发卡建档，后续方可进入充值、消费、状态管理和台账查询。机主侧发卡、充值和台账查看为 P2 预留。

**主流程**

1. 系统管理员发起发卡，系统记录 IC卡号，并以 IC卡号 建立唯一卡片业务关联；发卡成功后，新卡进入可用状态，初始余额为 0。
2. 发卡后不强制首充；系统管理员可直接对指定卡充值。
3. 系统管理员发起充值时，系统生成独立 IC 卡充值订单，并记录对应充值结果。
4. 用户可在柜机支付方式页选择 IC 卡，并进入 IC 卡刷卡提示页。
5. 系统后端校验卡状态、水类型单价、档位水量、取水档位金额和卡内余额。
6. 当卡状态可用且余额满足按水类型单价计算出的取水档位金额时，完成 IC 卡直接消费，并进入柜机支付成功页。
7. 当卡状态可用、卡内余额小于取水档位金额时，柜机展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付；卡内余额可以为 0。
8. 当不满足补差条件时，不得继续 IC 卡消费，应返回支付方式选择。
9. 当发生消费、退款、冲正或补差相关处理时，系统后端记录对应台账。
10. 系统管理员可根据业务需要对卡执行停用或启用；停用卡不可消费，不可充值。
11. 系统管理员查看卡状态和台账记录；机主侧查看能力为 P2 预留。

**关键分支**

- 权限边界、直接充值、停用启用、补差条件与台账范围以 4.4 IC 卡业务规则为准。
- IC 卡充值生成独立充值订单，与取水订单分开处理。
- 补差取消或失败时，如已形成冻结金额，应释放对应金额并记录台账。

**流程结果**

- IC 卡形成完整的生命周期管理记录。
- IC 卡充值订单与取水订单分开留痕和查询。
- 系统管理员完成管理动作，用户完成消费动作。
- 台账覆盖发卡、充值、消费、退款、停用、启用及补差相关记录。
- 停用、启用和直接充值等管理动作均可追溯。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["系统管理员发起发卡并记录 IC卡号"] --> B["系统建立唯一卡片业务关联；新卡进入可用状态，余额为 0"]
    B --> C{"是否发起充值"}
    C -->|"系统管理员直充"| E["系统管理员直接充值并填写原因"]
    E --> E1["生成 IC 卡充值订单并记录充值台账"]
    E1 --> F["更新充值结果"]
    B --> G["用户在柜机支付方式页选择 IC 卡"]
    G --> H["柜机展示刷卡提示并校验卡状态、水类型单价、档位金额与卡内余额"]
    H --> I{"是否满足直接消费条件"}
    I -->|"是"| J["完成消费并进入柜机支付成功页"]
    I -->|"否"| K{"是否满足补差条件"}
    K -->|"是"| L["柜机展示补差二维码页（LINE Pay/Alipay/WeChat Pay）"]
    K -->|"否"| M["返回其他支付选择"]
    L --> N["用户扫码补差并记录相关台账"]
    J --> O["如发生退款或冲正，继续记录台账"]
    N --> O
    B --> P["系统管理员可按规则停用或启用"]
    P --> Q{"状态结果"}
    Q -->|"停用"| R["卡不可消费、不可充值"]
    Q -->|"启用或保持可用"| S["卡继续可用"]
    F --> T["系统管理员查看状态与台账"]
    O --> T
    M --> T
    R --> T
    S --> T
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor U as 用户
    participant K as 柜机端
    participant C as C端
    participant S as 系统后端

    A->>S: 发起发卡并提交 IC卡号
    S-->>A: 建立卡片关联并返回新卡可用、余额为 0

    Note over A,S: 停用与启用仅系统管理员可执行

    opt 系统管理员直接充值
        A->>S: 对指定卡直接充值并填写原因
        S->>S: 生成 IC 卡充值订单
        S->>S: 记录充值台账
        S-->>A: 返回充值结果
    end

    opt 用户消费
        U->>K: 选择 IC 卡 并刷卡
        alt 卡不可用或未识别
            K-->>U: 展示刷卡异常页
            alt 用户选择重试
                U->>K: 重试刷卡
            else 用户选择返回
                U->>K: 返回支付方式页
            end
        else 刷卡成功
            K->>S: 校验卡状态、水类型单价、取水档位金额与余额
            alt 卡可用且余额满足取水档位金额
                S-->>K: 返回消费成功
                S->>S: 记录消费台账
            else 余额不足且满足补差条件
                alt 卡内余额大于 0
                    S->>S: 冻结卡内可用金额
                else 卡内余额等于 0
                    S->>S: 不冻结金额
                end
                S-->>K: 返回补差支付路径
                K-->>U: 展示补差二维码页（LINE Pay/Alipay/WeChat Pay）
                U->>C: 选择扫码方式并确认补差支付
                C->>S: 发起扫码补差支付
                alt 补差成功
                    S->>S: 记录补差冻结与消费台账
                else 补差取消或失败
                    S->>S: 释放已形成的冻结金额并记录台账
                end
            else 停用或余额不足且不满足补差条件
                S-->>K: 返回不可消费或其他支付选择
            end
        end
    end

    opt 发生退款或冲正
        S->>S: 更新卡余额并记录退款或冲正台账
    end

    opt 系统管理员停用或启用
        A->>S: 执行停用或启用
        S->>S: 更新卡状态并记录台账
        S-->>A: 返回处理结果
    end

    A->>S: 查看指定卡状态和台账
```

### 5.5 系统管理配置流程

**流程目标**  
完成系统管理员对全平台通用购水套餐配置、设备取水档位配置和纯水单价/矿化水单价配置的 P1 管理闭环。设备远程控制流程见 5.6.1。

**触发条件**  
系统管理员在系统管理端发起购水套餐配置、设备取水档位配置或纯水单价/矿化水单价配置。

**参与角色与对象**  
系统管理员、系统后端、C 端用户。

**前置条件**

- 系统管理员具备系统管理端操作权限。
- 购水套餐配置需包含套餐价格、取水额度、上架销售开始时间和上架销售结束时间。
- 设备取水档位配置需指定设备和至少 1 个启用取水档位。
- 水类型单价配置需在系统配置页面（W23）配置纯水单价和矿化水单价，全局统一，所有设备共用。

**主流程**

1. 系统管理员进入系统管理端。
2. 若选择购水套餐配置，系统管理员配置全平台通用购水套餐价格、取水额度和上架销售时间。
3. 系统后端校验是否存在价格+取水额度+时间段完全相同的"在售中"或"待上架"套餐；如存在，阻断保存并提示冲突套餐信息。
4. 若选择设备取水档位配置，系统管理员选择设备并配置该设备已启用取水档位。
5. 若选择水类型单价配置，系统管理员在系统配置页面（W23）配置纯水单价和矿化水单价。
6. 用户购买套餐时，系统按当前处于上架销售期内的全平台通用套餐价格生成购买价格。
7. 用户单次取水、IC 卡消费或实付补差时，系统按水类型单价（纯水/矿化水）和取水量计算金额。
8. 用户购买套餐成功后，系统生成对应取水额度；已获得取水额度不随后续套餐价格调整而变化，不设有效期。

**关键分支**

- 仅状态为"在售中"的套餐可展示和购买。
- 价格+取水额度+时间段完全相同的套餐不可同时处于"在售中"或"待上架"状态。
- 设备未配置取水档位或未配置纯水单价或未配置矿化水单价时，不允许进入可售水状态，柜机不展示取水档位。
- 购水套餐金额全平台通用，取水档位在设备侧配置，纯水单价和矿化水单价在系统配置页面（W23）全局配置，所有设备共用。
- 管理员修改已有套餐的价格或取水额度，不影响已购用户的存量额度。
- 管理员可提前下架套餐（修改上架销售结束时间），下架后套餐不可购买，已购用户额度不受影响。
- 有用户已购买时，管理员可删除套餐配置，已购用户的存量额度不受影响。

**流程结果**

- 系统管理员完成全平台通用购水套餐、设备取水档位或纯水单价/矿化水单价配置。
- 用户购买套餐后获得对应取水额度，存量额度不受后续价格变化影响，不设有效期。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["系统管理员进入系统管理端"] --> B{"选择配置类型"}
    B -->|"购水套餐配置"| P["配置全平台通用套餐价格、水量和上架销售时间"]
    P --> T{"是否存在相同规格的在售/待上架套餐"}
    T -->|"是"| U["阻断保存并提示冲突套餐信息"]
    T -->|"否"| V["保存为草稿，管理员手动上架"]
    V --> W["用户购买时按上架销售期内的通用套餐结算"]
    W --> X["购买成功后生成取水额度（不设有效期）"]
    B -->|"设备取水档位配置"| Y["选择设备并配置取水档位"]
    Y --> Z["保存设备取水档位"]
    Z --> AA["柜机仅展示已启用取水档位"]
    B -->|"水类型单价配置"| AB["配置纯水单价和矿化水单价"]
    AB --> AC["保存纯水单价和矿化水单价"]
    AC --> AD["单次取水、IC 卡消费和实付补差按设备单价计费"]
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor U as C端用户
    participant S as 系统后端
    participant D as 设备

    alt 购水套餐配置
        A->>S: 配置全平台通用套餐价格、水量和上架销售时间
        S->>S: 校验是否存在相同规格的在售/待上架套餐
        alt 存在重复
            S-->>A: 阻断保存并提示冲突套餐信息
        else 不存在重复
            S->>S: 保存为草稿
            Note over S,U: 套餐配置生效后，供 5.2 套餐购买流程使用
        end
    else 设备取水档位配置
        A->>S: 选择设备并配置取水档位
        S->>S: 保存设备取水档位
        Note over S,D: 柜机仅展示已启用取水档位
    else 水类型单价配置
        A->>S: 在W23配置纯水单价和矿化水单价
        S->>S: 保存纯水单价和矿化水单价
        Note over S,D: 水类型单价用于单次取水、IC 卡消费和实付补差
    end
```

### 5.6 设备通讯与控制流程

**流程目标**
统一管理柜机设备的远程控制、运行状态、数据采集、IC卡余额同步、摄像头管理、离线处理与异常告警。

**触发条件**
设备通电上线、周期性数据上报、系统管理员发起远程控制、用户发起取水消费。

**参与角色与对象**
系统管理员、系统后端、设备、C端用户。

**前置条件**

- 设备已在平台建档。
- 设备已配置取水档位、纯水单价和矿化水单价。

#### 5.6.1 远程控制流程

**流程目标**
完成系统管理员对设备的远程控制操作，包括关机、开机、重启、放水、维护模式、售水功能、制水功能、免费打水模式等 8 种设备控制指令。

**触发条件**
系统管理员在系统管理端发起设备远程控制操作。

**参与角色与对象**
系统管理员、系统后端、设备。

**前置条件**

- 系统管理员具备系统管理端操作权限。
- 设备已在平台建档。

**主流程**

1. 系统管理员选择目标设备。
2. 系统后端校验网络状态。
3. 当设备在线时，系统后端继续校验设备运行状态。
4. 当设备离线时，系统拒绝执行指令，提示设备离线；控制记录中生成一条失败记录（失败原因：设备离线）。
5. 系统管理员选择控制类型（关机、开机、重启、放水、维护模式、售水功能、制水功能、免费打水）。
6. 系统后端校验指令合法性（如：忙碌状态下不可关机）。
7. 校验通过后，系统后端下发远程控制指令。
8. 设备执行指令并返回结果。
9. 系统后端记录指令内容与执行结果。
10. 系统展示执行结果。

**关键分支**

- 设备离线时，系统拒绝执行指令，提示设备离线。
- 关机指令在忙碌状态下不可执行，需等待订单完成或取消。
- 放水额度大于 65L 时，不允许提交。
- 远程放水记录写入设备管理记录和系统留痕，不生成订单。
- 远程放水期间，柜机实体按钮（绿色继续/红色暂停）允许操作。用户按红色按钮暂停时，控制记录状态更新为"已暂停"并记录暂停时间；按绿色按钮继续时，控制记录恢复"执行中"并记录继续时间；暂停超时3分钟自动停止时，控制记录标记"成功(部分)"并记录实际出水量。实体按钮的暂停/继续操作均写入控制记录操作日志。
- 所有远程控制指令需要记录指令内容与执行结果。

**流程结果**

- 系统管理员完成设备远程控制，并获得明确执行结果。
- 远程放水形成可追溯记录，并写入设备管理记录和系统留痕。
- 所有控制指令形成可追溯记录。

**主流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["系统管理员选择目标设备"] --> B{"网络状态是否在线"}
    B -->|"否"| C["拒绝执行，提示设备离线"]
    B -->|"是"| D{"校验设备运行状态"}
    D -->|"校验失败"| E["阻断执行并提示原因"]
    D -->|"校验通过"| F{"选择控制类型"}
    F -->|"关机"| G["下发关机指令"]
    F -->|"开机"| H["下发开机指令"]
    F -->|"重启"| I["下发重启指令"]
    F -->|"放水"| J["输入放水额度并下发放水指令"]
    F -->|"维护模式"| K["下发维护模式开关指令"]
    F -->|"售水功能"| L["下发售水功能开关指令"]
    F -->|"制水功能"| M["下发制水功能开关指令"]
    F -->|"免费打水"| N["下发免费打水模式指令"]
    G --> O{"执行结果"}
    H --> O
    I --> O
    J --> O
    K --> O
    L --> O
    M --> O
    N --> O
    O -->|"成功"| P["展示成功结果并记录"]
    O -->|"失败"| Q["展示失败结果并记录，支持手动重试"]
```

**状态校验子流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["检查设备在线状态"] --> B{"是否在线"}
    B -->|"否"| C["拒绝执行，提示设备离线"]
    B -->|"是"| D["检查设备运行状态"]
    D --> E{"运行状态"}
    E -->|"忙碌"| F{"指令类型"}
    F -->|"关机"| G["阻断：忙碌状态下不可关机"]
    F -->|"其他"| H["允许执行"]
    E -->|"已关机"| I{"指令类型"}
    I -->|"关机"| J["阻断：已关机状态"]
    I -->|"开机"| K["允许执行"]
    I -->|"其他"| L["允许执行"]
    E -->|"维护中"| M{"指令类型"}
    M -->|"放水"| N["阻断：维护中不可放水"]
    M -->|"其他"| O["允许执行"]
    E -->|"正常"| P["允许执行"]
```

**离线拒绝子流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["设备离线"] --> B["拒绝执行指令"]
    B --> C["提示系统管理员设备离线"]
    C --> D["控制记录生成失败记录（失败原因：设备离线）"]
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    participant S as 系统后端
    participant D as 设备

    A->>S: 选择设备并发起远程控制
    S->>S: 校验网络状态
    alt 设备离线
        S->>S: 拒绝执行指令
        S-->>A: 返回设备离线，无法执行
    else 设备在线
        S->>S: 校验设备运行状态
        alt 校验失败
            S-->>A: 返回校验失败原因
        else 校验通过
            alt 远程放水
                A->>S: 输入放水额度
                S->>S: 校验额度最高 65L
                S->>S: 生成远程放水记录
                S->>D: 下发放水指令
                Note over D: 用户可按实体按钮暂停/继续
                D->>D: 实体按钮暂停→记录暂停状态
                D-->>S: 上报暂停/继续状态变更
                S->>S: 更新控制记录状态
                D-->>S: 返回执行结果
                S->>S: 更新远程放水记录并写入设备管理记录和系统留痕
                S-->>A: 展示成功或失败结果
            else 其他控制指令
                S->>D: 下发控制指令
                D-->>S: 返回执行结果
                S->>S: 记录指令内容与执行结果
                S-->>A: 展示成功或失败结果
            end
        end
    end
```

#### 5.6.2 设备状态与售水规则

**网络状态**

| 状态 | 定义 | 触发方 |
|-----|------|-------|
| 在线 | 设备与后端网络连接正常 | 系统（心跳检测） |
| 离线 | 超过6分钟无心跳上报 | 系统 |

**运行状态**

| 状态 | 定义 | 触发方 |
|-----|------|-------|
| 待机 | 设备正常运行，等待用户操作 | 系统/硬件 |
| 忙碌 | 当前取水订单进行中 | 用户主动 |
| 关机 | 设备处于关机状态 | 系统管理员远程关机/硬件关机 |
| 维护 | 设备处于人工维护状态，由系统管理员通过维护模式指令控制；设备售水锁开启后等同于进入维护状态，不可售水 | 系统管理员 |

告警不影响运行状态，由告警维度独立管理。设备可同时处于任意运行状态和告警状态。

**状态流转规则**

- 关机指令在忙碌状态下不可执行，需等待订单完成或取消。
- 关机指令可在其他任何状态下执行。
- 开机指令可在关机状态下执行。

**售水状态**

- 方案：自动计算 + 系统管理员可通过维护开关手动覆盖。
- 可售水条件（必须同时满足）：
  1. 网络状态为在线。
  2. 运行状态为待机（忙碌中不可发起新取水，但不影响进行中的订单）。
  3. 可售水手动开关为开启。
  4. 无影响售水的告警（见 §5.6.9 告警类型表）。
  5. 水位不低于低液位浮球（即水位为中或高）。低液位浮球触发时无条件不可售水，不依赖外部水源状态。
- 不可售水条件（满足任一）：
  - 设备离线（超过6分钟无心跳）。
  - 运行状态为关机或维护。
  - 可售水手动开关为关闭。
  - 水位低（低液位浮球触发），无条件不可售水。
  - 存在影响售水的告警（长时间水位过低、流量计故障）。
  - 设备忙（忙碌）。

**水位定义**

| 状态 | 定义 |
|-----|------|
| 高 | 水位处于高液位浮球附近（水箱接近满） |
| 中 | 水位处于高低液位浮球之间 |
| 低 | 水位低于低液位浮球（触发低水位硬限制，无条件不可售水） |

**制水阀值**

制水阀值是独立于液位浮球的可配置参数，按设备型号在系统管理端统一设定，新建设备时自动读取，不允许单台设备覆盖。水位低于制水阀值时，主板自动开始制水；水位到达高液位浮球时自动停止。制水阀值的目的是在水位降到低液位浮球之前提前开始制水，减少低水位导致不可售水的频率。

- 制水阀值不能完全避免低水位——连续大量取水时仍可能触达低液位浮球。
- 制水阀值和低水位不售水是两个独立机制：制水阀值管"什么时候开始补水"，低液位浮球管"什么时候禁售"。
- 制水阀值设为0时关闭自动制水功能（主板要求：水箱容量和制水阀值两个值都不为0才开启此功能）。

**制水逻辑**

- **自动制水（制水阀值触发）**：水位低于制水阀值时，主板自动开始制水；水位到达高液位浮球时自动停止。制水阀值按型号配置在系统管理端，下发到主板生效。
- **手动制水开关**：系统后台有单独制水开关，默认开启。与制水阀值自动制水独立共存。
- 制水开关可远程控制（远程开启/关闭制水功能）。
- 条件：系统管理员发起远程关闭制水功能。操作：系统下发指令到设备。结果：设备停止制水功能（含自动制水和手动触发）。
- 条件：系统管理员发起远程开启制水功能。操作：系统下发指令到设备。结果：设备恢复制水功能。
- 条件：外部水源无水（无原水进入水路）。操作：设备无法制新水。结果：设备持续售水直至水箱水位降至低液位浮球，触发低水位硬限制，不可售水。
- 低水位持续超过1小时，触发"长时间水位过低"告警（见§5.6.9）。水位恢复到非低状态后，告警自动恢复。
- 水满状态（Data[1]=0x03）时主板自动停止制水泵，系统侧无需下发停止指令。

**水满时间记录**

- 每次收到0A命令时，若Data[1]=0x03则更新"上次水满时间"时间戳。水满状态下每次上报都刷新。
- 该数据用于设备概览展示，配合"上次水满后售水量"供管理员判断设备闲置程度。

#### 5.6.3 上报机制与上报内容

**上报机制**

- 网络通讯心跳：每2分钟上报一次，超过6分钟没上报判定为离线。
- 综合状态周期上报：每10分钟上报一次，包含设备状态数据。

**综合状态周期上报内容（每10分钟）**

| 数据项 | 说明 |
|-------|------|
| 机器忙闲 | 0正常/1忙碌 |
| 水箱水位 | 无水/有水/水满（有液状态10分钟上报一次，缺液时5分钟一次） |
| 售水量 | 上次水满后售水量（L） |
| 剩余水量 | 当前水箱剩余水量（L） |
| 外部水源状态 | 有水源/无水源（无水源 = 水压低，无原水进入水路） |
| 流量计故障 | 正常/故障 |
| 实时金额/水量 | 打水过程中持续上报 |

**TDS水质数据（独立命令07，每10分钟）**

TDS数据由独立命令07上报，不在综合状态周期上报范围内：
- 数据格式：6字节，前2字节=原水TDS数值，中2字节=纯水TDS数值，后2字节=矿化水TDS数值
- 上报周期：每10分钟
- 告警阈值：纯水TDS>50ppm触发"净水TDS过高"告警（仅纯水触发，矿化水TDS仅监测不告警）

**设备通电/重启上报**

| 数据项 | 说明 |
|-------|------|
| ICCID | SIM卡识别码 |
| IMEI | 设备国际移动设备识别码 |
| 固件版本号 | 设备固件版本 |
| 程序版本 | 设备程序版本 |

**屏幕显示控制**

| 功能 | 指令 | 说明 |
|-----|------|------|
| 交易显示页面 | 01 | 主板控制屏幕显示交易信息 |
| 待机广告页面 | 00 | 主板控制屏幕显示待机广告 |
| 水箱信息显示 | — | 通过接受主板发送的指令将水箱水位、继电器状态、温度等信息显示在屏幕上 |
| 卡余额显示 | — | 屏幕根据指令显示卡余额 |
| 设备状态显示 | — | 以不同颜色（正常/故障）展示设备状态 |
| 实时金额/水量刷新 | — | 打水过程中屏幕跟随实时刷新金额和水量的数值 |

**水表电表数据采集（每5分钟）**

| 设备 | 功能 | 说明 |
|-----|------|------|
| 水表 | 读取累计流量 | 水表累计读数 |
| 水表 | 读取阀门状态 | 开/关 |
| 电表 | 读取用量 | 电表累计读数 |

**基数管理**

- 每台设备的水表/电表不单独编号，以设备维度统一管理读数。
- 设备重启、异常恢复、维护恢复后，第一次采集的读数记录为新的"基数"，作为该阶段增量计算的起点。
- 基数变更事件记录在采集明细中，可通过设备详情页（W02）和水电用量页（W13）的明细弹窗查看。
- 采集过程中出现负增量（读数低于上次读数）时，该条记录标记为异常，不计入累计使用量。

**出厂原始值与使用量计算**

- 每块水表/电表安装后，首次采集的读数记为该表的"出厂原始值"（表上已有的历史累计数据，非本设备使用产生）。
- 累计使用量 = 最新读数 - 出厂原始值（仅统计本设备实际消耗量）。
- 近 30 天用量 = 最近 30 天内最后一次读数与最早一次读数的差值。
- 基数变更后：累计使用量 = Σ(各阶段增量)，各阶段增量 = 阶段末次读数 − 阶段基数。跨基数持续累加，不重置。

**读数失败告警**

- 每次采集失败，失败计数 +1；采集成功后计数归零。
- 连续失败 3 次，系统自动生成告警（水表读取失败 / 电表读取失败）。
- 采集成功后，系统自动关闭对应告警。
- 若管理员手动标记告警为"已处理"后再次连续失败 3 次，系统重新生成告警。

**滤芯数据**

- 滤芯寿命根据不同等级滤芯的名称，设定3-36个月的生命周期。
- 该数据与柜机原型中的滤芯生命值相关。

**设备状态上报协议（命令0A）**

单路售水机，数据范围Data[0]-Data[23]。Data[12-15]（广告灯、温控）不需要记录，有效字段11个。无止水阀、无第二路相关字段。

| 字节 | 字段 | 取值 | 用途 |
|------|------|------|------|
| Data[0] | 机器状态 | 0=正常, 1=忙碌 | 运行状态映射 |
| Data[1] | 水箱状态 | 0x01=无水, 0x02=有水, 0x03=水满 | 水位判定（有液10分钟/缺液5分钟上报） |
| Data[2] | 外部水源状态 | 0=有水源, 1=没有水源 | 缺水判定 |
| Data[3] | 箱体内部温度 | 实时数值 | 设备概览展示，不触发告警 |
| Data[4-5] | 打水灯锁继电器 | 0100=关, 0101=开 | 取水舱指示灯（待机关/取水开） |
| Data[6-7] | 冲洗阀继电器 | 0200=关, 0201=开 | 继电器状态展示 |
| Data[8-9] | 制水泵继电器 | 0300=关, 0301=开 | 继电器状态展示 |
| Data[10-11] | 臭氧杀菌继电器 | 0400=关, 0401=开 | 继电器状态展示 |
| Data[16-17] | 灌装泵继电器 | 0700=关, 0701=开 | 继电器状态展示 |
| Data[18-19] | 流量计故障 | 0800=正常, 0801=故障 | 流量计故障告警（硬件直接上报） |
| Data[20-21] | 上次水满后售水量 | 单位L | 水满时重置，所有型号支持 |
| Data[22-23] | 当前水箱剩余水量 | 单位L | 精确水量管理+出水异常检测，所有型号支持 |

**不再支持的功能**

- 漏水检测、门状态检测、UPS、止水阀状态检测。

#### 5.6.4 远程控制指令

**指令执行规则**

- 单条指令执行，不可并行执行多条。
- 后发的命令会进行排队。
- MCU缓冲区满后指令会丢失（缓冲区大小待定）。
- 固件升级与指令目前没有超时限制（消费指令除外，有20分钟判定）。

**离线指令处理**

- 系统管理员下发指令时，如果设备离线，系统拒绝执行该指令。
- 系统提示管理员设备离线，无法执行。
- 控制记录中生成一条失败记录（失败原因：设备离线），便于追溯。

**控制记录**

- 所有远程控制指令需要记录指令内容与执行结果。
- 记录内容：指令类型、下发时间、执行结果、设备响应等。
- 后续原型中需要展示控制记录列表。
- 远程放水指令状态扩展为 5 种：待执行 / 执行中 / 已暂停 / 成功 / 失败。"已暂停"状态仅适用于远程放水指令，由柜机实体按钮触发；暂停超时 3 分钟自动停止后标记为"成功(部分)"，记录实际出水量。

**指令分类**

| 分类 | 指令 |
|-----|------|
| 设备控制 | 远程关机、远程开机、远程重启、远程放水、远程开启/关闭维护模式、远程开启/关闭售水功能、远程开启/关闭制水功能、开启免费打水模式 |
| 设备配置 | 配置下发、修改服务器地址/端口、修改设备号、恢复出厂设置、滤芯复位 |
| 固件升级 | 固件升级（OTA）、MCU在线升级、MCU回滚升级 |
| 内容管理 | 广告/公告下发 |
| 数据读取 | 读取水表累计流量与阀门状态、广播码读取水表唯一地址编码、读取电表地址/波特率/通信参数、修改电表通讯参数/波特率/地址 |

**指令清单（21项）**

| 指令 | 分类 | 说明 | 特殊处理 |
|-----|------|------|---------|
| 远程关机 | 设备控制 | 关闭设备运行 | 关机后不可售水 |
| 远程开机 | 设备控制 | 唤醒已关机设备 | — |
| 远程重启 | 设备控制 | 设备软重启 | 重启期间不可售水 |
| 远程放水 | 设备控制 | 按指定额度放水（最高 65L） | 记录过程与结果 |
| 远程开启/关闭维护模式 | 设备控制 | 开启后设备进入维护状态，不可售水；关闭后恢复正常 | 开启维护=不可售水 |
| 远程开启/关闭售水功能 | 设备控制 | 控制售水功能开关 | — |
| 远程开启/关闭制水功能 | 设备控制 | 控制制水功能开关 | — |
| 开启免费打水模式 | 设备控制 | 运营商测试用 | 免费取水，不扣费 |
| 滤芯复位 | 设备配置 | 重置滤芯寿命计数 | 更新滤芯寿命 |
| 恢复出厂设置 | 设备配置 | 清除业务配置 | 自动重启，网络配置与设备编号不变 |
| 固件升级（OTA） | 固件升级 | 推送固件包 | 支持失败回滚 |
| 广告/公告下发 | 内容管理 | 推送内容到柜机屏幕 | 支持图文、视频 |
| 配置下发 | 设备配置 | 取水档位、单价、套餐、设备参数 | 所有参数均支持远程下发 |
| 修改服务器地址/端口 | 设备配置 | 实现IoT地址更换 | — |
| 修改设备号 | 设备配置 | 实现换绑 | — |
| MCU在线升级 | 固件升级 | 下发URL | — |
| MCU回滚升级 | 固件升级 | 获取生产版本 | 支持失败回滚 |
| 读取水表累计流量与阀门状态 | 数据读取 | 水表数据读取 | — |
| 广播码读取水表唯一地址编码 | 数据读取 | 水表地址读取 | — |
| 读取电表地址/波特率/通信参数 | 数据读取 | 电表参数读取 | — |
| 修改电表通讯参数/波特率/地址 | 数据读取 | 电表参数配置 | — |

**柜机参数配置与升级**

| 功能 | 说明 |
|-----|------|
| 配置单路售水机运行参数 | 设备在线状态，平台下发指令，可对售水机运行参数进行设置 |
| 恢复出厂默认参数 | 平台下发指令，可让设备恢复出厂默认参数 |
| 修改服务器地址/端口 | 实现IoT地址更换 |
| 修改设备号 | 实现换绑 |
| MCU在线升级 | 下发URL |
| MCU回滚升级 | 获取生产版本 |

**固件升级流程（命令30）**

1. 服务端下发MCU升级包URL地址。
2. 模块获取程序包给单片机更新。
3. 模块给单片机发送28指令。
4. 单片机返回28成功后进入OTA流程。
5. 更新完成后单片机上报29指令。

**设备参数配置**

- 默认计费模式：流量模式。
- 所有参数均支持远程下发。
- 取水范围：1-65L，设备在配置取水档位时，必须要在此区间内。
- 设备恢复出厂设置后，所有参数恢复默认值，包括语音播报设置（默认播报）和喇叭音量（默认 80）。
- 喇叭音量参数与语音播报设置独立，音量为 0 时设备静音但不影响语音播报开关状态。
- 喇叭硬件参数（型号、阻抗、功率等）待供应商确认后补充。

**设备可配置参数清单（命令04）**

| 参数 | Data位置 | 默认值 | 范围 | 说明 |
|-----|---------|-------|------|------|
| 修改/恢复出厂 | [0] | — | 00/01 | 01修改参数，00恢复出厂 |
| 刷卡扣费金额 | [1-2] | 100分 | 1-6000 | — |
| 流量计脉冲数量 | [3-4] | 450 | 1-2000 | 时间模式默认450，流量模式根据规格填写 |
| 刷卡打水时间 | [5-6] | 45S | 1-1000 | 下发时×2，接收时÷2 |
| 刷卡打水水量 | [10-11] | 7500ML | 1-65000 | 预扣费金额的打水量 |
| 钱数回收时间 | [12-13] | 60S | 10-240 | — |
| 打水灯延时 | [14] | 60S | 5-240 | — |
| 打水锁延时 | [15] | 60S | 5-240 | — |
| 制水延时 | [16] | 1分 | 1-60 | — |
| 废水冲洗时间 | [17] | 10S | 10-240 | — |
| 废水冲洗时间间隔 | [18] | 10分 | 5-240 | — |
| 臭氧杀菌时间 | [19] | 10S | 5-240 | — |
| 臭氧杀菌时间间隔 | [20] | 60分 | 30-240 | — |
| 循环冲洗时间 | [27] | 10S | 0-99 | — |
| 循环冲洗时间间隔 | [28] | 4H | 1-10 | — |
| 主板运行模式 | [29] | 2（流量模式） | 1-2 | 1时间模式，2流量模式 |
| 语音播报设置 | [30] | 1（播报） | 1-3 | 0x01播报，0x02关闭语音，0x03关闭所有语音 |
| 微信打水钱数 | [31-32] | 100分 | 1-6000 | — |
| 微信打水时间 | [33-34] | 45S | 1-10000 | 下发时×2，接收时÷2 |
| 微信打水水量 | [35-36] | 7500ML | 1-65000 | — |
| 喇叭音量 | [39] | 80 | 0-100 | 0为静音，恢复出厂后恢复默认值（具体参数待供应商确认后调整） |

#### 5.6.5 消费流程

消费流程分为两条主线：刷卡消费和扫码远程消费。

##### 一、刷卡消费流程

**流程说明**

1. 用户刷卡。
2. 判断主板是否在线：
   - 在线：主板发送20指令到服务端 → 服务端处理 → 返回20指令到主板。
   - 离线：主板直接判断主板内存储的当前卡是否可消费。
3. 扣费：扣卡内余额，修改主板内存储。
4. 进入打水流程。
5. 打水结束后的消费记录处理：
   - 在线刷卡消费：上传消费记录22。
   - 离线刷卡：将消费记录23存储在主板上，待机器联网后自动上传。
   - 预扣费余额可通过刷卡回收。
6. 服务端处理消费记录（22/23）：
   - 联网情况下，金额以线上存储的卡金额为准。
   - 只要有消费记录上报，就扣线上卡余额。
7. 结束：服务端返回22或23到主板，流程结束。

**刷卡在线时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
sequenceDiagram
    actor User as 用户
    participant Client as 客户端
    participant MB as 主板
    participant Server as 服务端

    User->>Client: 刷卡
    Client->>MB: 传递刷卡信息
    MB->>MB: 判断主板是否在线
    alt 主板在线
        MB->>Server: 20指令（查询卡信息）
        Server->>Server: 处理询问信息<br/>判断卡状态、卡金额
        Server->>Server: 判断当前卡对应账号下余额
        Server-->>MB: 返回20指令（卡状态+余额）
    else 主板离线
        MB->>MB: 直接判断主板内存储的<br/>当前卡是否可消费
    end
    MB->>MB: 扣卡内余额<br/>修改主板内存储
    MB->>MB: 进入打水流程
    MB->>MB: 打水结束
    MB->>Server: 上传消费记录22（在线）
    Note over MB,Server: 记录包含：卡号、卡余额、<br/>消费金额、刷卡时间等
    Server->>Server: 以线上存储的卡金额为准<br/>扣除卡余额
    Server-->>MB: 返回22
    MB-->>Client: 结束
```

**刷卡离线补传时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
sequenceDiagram
    actor User as 用户
    participant MB as 主板
    participant Server as 服务端

    User->>MB: 刷卡
    MB->>MB: 主板离线，判断主板内存储的<br/>当前卡是否可消费
    MB->>MB: 扣卡内余额<br/>修改主板内存储
    MB->>MB: 进入打水流程
    MB->>MB: 打水结束
    MB->>MB: 存储消费记录23到主板<br/>（卡号、余额、消费金额、时间）
    Note over MB: 等待机器联网...
    MB->>Server: 联网后自动上传消费记录23
    Server->>Server: 根据卡对应账户<br/>扣除账户余额
    Server-->>MB: 返回23
    MB-->>User: 结束
```

**20指令详情（刷卡消费查询）**

- 触发时机：用户刷卡时，主板在线状态下。
- 作用：主板发送20指令到服务端，查询卡状态、卡金额等信息。
- 处理逻辑：服务端判断卡状态、卡金额，判断当前卡对应账号下的余额，统一返回到主板。

**22指令详情（在线消费记录上报）**

- 触发时机：在线刷卡消费结束后。
- 作用：上传消费记录到服务端。
- 内容：卡号、卡余额、本次消费金额、刷卡时主板时间等信息。

**23指令详情（离线消费记录上报）**

- 触发时机：离线刷卡消费结束后。
- 作用：将消费记录存储在主板上，待机器联网后自动上传。
- 处理逻辑：离线刷卡将消费记录23存储在主板上，待机器联网后自动逐条上传，上传后服务端根据该卡对应账户的情况扣除账户余额。

##### 二、扫码远程消费流程

**流程说明**

1. 用户扫码。
2. 服务端处理：远程消费分2种（远程下发实体卡号、微信/支付宝直接支付消费），服务端下发21指令给主板。
3. 主板响应：机器收到21指令后，再次回传21到服务器，确认已收到远程消费指令。
4. 服务端判断：收到21返回说明机器正常接收，若状态为01或02则认定打水失败，直接给用户退款。
5. 进入打水流程。
6. 结束：打水结束后，系统自动根据真实出水量计算实际消费金额，如果实际消费金额 < 预扣金额，系统自动退回剩余金额。

**扫码远程消费时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
sequenceDiagram
    actor User as 用户
    participant Client as 客户端
    participant Server as 服务端
    participant MB as 主板

    User->>Client: 扫码远程消费
    Client->>Server: 发起远程消费请求
    Server->>Server: 处理及判断远程消费<br/>（远程下发实体卡号 / 微信支付宝直接支付）
    Server->>MB: 下发21指令（远程消费）
    MB->>Server: 回传21（确认收到指令）
    Server->>Server: 判断21返回状态
    alt 状态为01或02（打水失败）
        Server->>User: 直接退款
    else 状态正常（打水中）
        MB->>MB: 进入打水流程
        MB->>MB: 打水结束
        Server->>Server: 根据真实出水量计算实际消费金额
        alt 实际消费金额 < 预扣金额
            Server->>User: 自动退回剩余金额
        end
    end
    MB->>Server: 上传消费记录22
    Server-->>MB: 返回22
```

**21指令详情（远程消费指令）**

- 触发时机：扫码支付完成后，服务端下发到机器。
- 作用：通知机器开始售水。
- 机器响应：机器收到后返回21指令，返回内容包含当前机器状态。

**21指令数据字节**

| 字段 | 说明 | 用途 |
|-----|------|------|
| 卡类型 | 0x01卡消费（IC物理卡）、0x03游客消费 | 区分消费类型 |
| 消费方式 | 0免费、2时效套餐 | 区分消费方式 |
| 卡号或卡id | IC卡物理卡号 | 关联用户和订单 |
| 本次消费金额 | 远程本次消费金额 | 退款计算依据 |
| 剩余金额 | 扣掉本次费用后的余额 | IC卡余额同步 |
| 消费标识 | YYMMddHHmmss | 订单关联和追踪 |

**21指令返回数据**

| 字段 | 说明 | 用途 |
|-----|------|------|
| 卡类型 | 同上 | 确认消费类型 |
| 消费方式 | 同上 | 确认消费方式 |
| 卡号或卡id | 同上 | 确认用户身份 |
| 状态 | 00收到、01设备忙、02机器没有水 | 判定设备状态 |
| 消费标识 | yyMMddHHmmss | 订单关联和追踪 |

**21指令返回状态映射**

| 状态码 | 含义 | 对应设备状态 |
|-------|------|-------------|
| 00 | 收到 | 设备正常，可以开始售水 |
| 01 | 设备忙 | 设备当前有其他订单进行中（忙碌状态） |
| 02 | 机器没有水 | 设备缺水（无水状态） |

**卡类型映射**

| 卡类型 | 对应系统功能 |
|-------|-------------|
| 0x01卡消费 | IC物理卡消费 |
| 0x03游客消费 | 游客消费 |

**消费方式映射**

| 消费方式 | 对应系统功能 |
|---------|-------------|
| 0免费 | 免费打水模式（运营商测试用） |
| 2时效套餐 | 套餐消费 |

**金额处理与状态判定（5种情况）**

| 情况 | 21返回 | 22消费结束 | 处理方式 | 状态 |
|-----|-------|-----------|---------|------|
| 1 | 收到 | 收到（20分钟内） | 根据22实际消费金额判断是否退款 | 消费成功 |
| 2 | 收到 | 未收到（等待20分钟） | 认定全额消费，不退款 | 消费成功 |
| 3 | 未收到 | 收到 | 根据22实际消费金额判断是否退款 | 消费成功 |
| 4 | 未收到 | 未收到 | 20分钟后发起退款 | 未消费 |
| 5 | 收到（机器忙/缺水） | — | 立即退款 | 设备忙/设备故障 |

**特殊情况处理**

- 20分钟后收到22指令：以22指令的实际内容为准，如果少出水则执行退款，如果全额消费则不退款，更新记录到订单中。

**退款规则**

| 条件 | 处理 |
|-----|------|
| 22上报金额 < 预付金额 | 退回差额 |
| 22上报金额 = 预付金额 | 不退款 |
| 设备忙/设备故障 | 系统自动退款 |

**超时规则**

- 21指令超时：20分钟（从21指令下发开始计算）。
- 22指令超时：20分钟（从21指令下发开始计算）。
- 超时未收到 → 情况2或情况4。

**指令编号汇总**

| 指令 | 含义 | 流程 |
|-----|------|------|
| 20 | 主板在线时，查询卡状态/金额信息 | 刷卡消费 |
| 21 | 服务端下发远程消费指令 | 扫码远程消费 |
| 22 | 在线消费记录上报 | 刷卡消费/扫码远程消费 |
| 23 | 离线消费记录上报 | 刷卡消费 |

#### 5.6.6 IC卡余额同步

**同步范围**：系统后端每 10 分钟将平台所有已发 IC 卡的当前余额全量推送到每台设备，设备本地维护完整余额表。该同步作为系统自动化任务执行，无需人工触发。

**同步规则**

| 规则 | 说明 |
|-----|------|
| 同步触发方 | 系统后端自动推送 |
| 同步范围 | 全量推送所有已发 IC 卡余额到每台设备 |
| 同步频率 | 每10分钟 |
| 离线后上线 | 立即同步 |
| 失败重试 | 下发失败时立即重试 |
| 连续失败告警 | 连续 3 次同步失败，触发告警（见 5.6.9 告警类型表"IC 卡余额同步失败"） |
| 余额不足（超额消费） | 设备离线时基于本地缓存余额扣款，上线同步后发现同一张卡实际余额不足以覆盖离线期间的消费，记录为异常订单 |

#### 5.6.7 摄像头管理

| 规则 | 说明 |
|-----|------|
| 查看位置 | Web 端设备详情页（W02） |
| 存储位置 | 柜机本地TF卡 |
| 保留时长 | 7天 |
| 覆盖策略 | 自动覆盖最旧录像 |
| 移动侦测 | 待定（摄像头选型未确定） |

#### 5.6.8 离线处理与同步

| 规则 | 说明 |
|-----|------|
| 离线消费记录 | 网络恢复后自动批量上报 |
| 离线IC卡余额同步 | 设备离线期间余额同步暂停，上线后立即触发全量同步（见 5.6.6 IC卡余额同步） |
| 离线支付 | 设备离线时不可售水，所有支付方式均不可用（包括 IC 卡、在线支付、扫码补差）。进行中的取水订单自动取消并全额退款（见 §5.6.2 售水状态）。 |

#### 5.6.9 异常与告警

**告警类型与恢复方式**

| 告警 | 触发条件 | 恢复方式 | 影响售水 | 触发工单 |
|-----|---------|---------|---------|---------|
| 外部水源无水 | 无原水进入水路（外部水源状态=无水源），无法制新水 | 自动恢复 | 是（影响制水能力，间接导致水位持续下降） | 是 |
| 滤芯即将到期 | 滤芯寿命接近阈值（如剩余 10%） | 人工确认 | 否 | 否 |
| 滤芯已过期 | 滤芯寿命已达到或超过阈值 | 人工确认 | 否 | 是 |
| 设备离线 | 超过6分钟无心跳上报 | 自动恢复 | 是（离线即不可售水） | 是（>30分钟） |
| 流量计故障 | 流量计异常 | 自动恢复 | 是（直接不可售水） | 是 |
| 出水异常 | 出水完成后，对比订单预期出水量与实际出水量变化（通过剩余水量Data[22-23]计算），偏差>10% | 自动恢复（下次出水正常后） | 否 | 否 |
| 净水TDS过高 | 净水TDS高于50 | 人工确认 | 否 | 否 |
| IC 卡余额同步失败 | 系统后端向设备推送 IC 卡余额同步任务连续 3 次失败 | 自动恢复（下次同步成功后解除） | 否 | 否 |
| 水表读取失败 | 水表数据采集连续失败 3 次 | 自动恢复（采集成功后解除）；支持管理员手动标记已处理，处理后再次连续失败 3 次重新告警 | 否 | 否 |
| 电表读取失败 | 电表数据采集连续失败 3 次 | 自动恢复（采集成功后解除）；支持管理员手动标记已处理，处理后再次连续失败 3 次重新告警 | 否 | 否 |
| 长时间水位过低 | 设备持续处于低水位状态超过 1 小时（低液位浮球触发后计时，水位恢复即重置） | 自动恢复（水位回到非低状态后系统自动标记已恢复） | 是（低水位无条件不可售水） | 是 |

**触发工单规则**：上述标记"触发工单=是"的 5 种告警触发后，系统自动生成工单并按服务区域自动派发给运维（设备离线需超过 30 分钟才触发工单；长时间水位过低需持续超过 1 小时才触发工单）。工单按设备维度合并：同一设备同一时间最多 1 个活跃工单，新告警追加到已有工单，不重复生成。离线类和低水位类告警恢复后工单自动关闭；硬件类告警（流量计/外部水源无水/滤芯已过期）恢复后保留工单，通知运维确认关闭。派发规则和恢复/关闭规则见 §5.8。

**通知渠道**：系统内通知。

**升级机制**：不支持。

**告警数据来源**

设备为单路售水机，0A命令数据范围Data[0]-Data[23]，有效字段11个（Data[12-15]广告灯/温控不记录），无止水阀、无第二路相关字段。

| 告警类型 | 数据来源 | 检测信号 | 检测周期 |
|---------|---------|---------|---------|
| 外部水源无水 | 0A命令 | Data[2]=1 | 每10分钟 |
| 流量计故障 | 0A命令 | Data[18-19]=0801 | 每10分钟 |
| 设备离线 | 心跳 | 6分钟无心跳 | 每2分钟 |
| 长时间水位过低 | 0A命令 | Data[1]=0x01持续>1小时 | 每10分钟 |
| 出水异常 | 0A命令 | 订单预期量vs剩余水量Data[22-23]变化，偏差>10% | 出水完成后 |
| 净水TDS过高 | 07命令 | 纯水TDS>50ppm（仅纯水触发，矿化水TDS仅监测不告警） | 每10分钟 |
| 滤芯即将到期 | 软件计算 | web后台管理时间（安装+寿命） | 系统定时扫描 |
| 滤芯已过期 | 软件计算 | 同上 | 系统定时扫描 |
| 水表读取失败 | 水表采集接口 | 连续3次采集失败 | 每5分钟 |
| 电表读取失败 | 电表采集接口 | 连续3次采集失败 | 每5分钟 |
| IC卡余额同步失败 | IC卡模块 | 连续3次同步失败 | 同步任务触发时 |

#### 5.6.10 语音播报规则

**功能定义**

- 语音播报是设备侧能力，由主板控制柜机喇叭在用户交互过程中播放语音提示，伴随每一步操作播放对应的语音。
- 播报语言跟随用户在待机页选择的语言，支持中文、英文、泰文、日文、韩文、俄文 6 种，选定后贯穿整个取水流程。
- 用户在待机页切换语言时立即播报对应语言的欢迎语；若用户未切换语言，点击"开始取水"时播放默认语言的欢迎语。
- 用户在语音播报未结束时进行下一步操作，立即打断当前语音，开始播报下一条。语音始终跟随用户操作而变动。
- 语言资源缺失或播报文案未定义时，默认按泰文回退。
- 语音播报由系统管理员通过设备参数配置控制开关，不跟随用户操作语言切换。
- 条件：语音播报设置参数为 0x01（播报）。操作：用户进入柜机交互流程。结果：设备在各交互节点自动播放对应语音提示。
- 条件：语音播报设置参数为 0x02（关闭语音）。操作：用户进入柜机交互流程。结果：设备不播放语音提示，屏幕显示不受影响。
- 条件：语音播报设置参数为 0x03（关闭所有语音）。操作：用户进入柜机交互流程。结果：设备不播放任何语音，包括系统提示音和操作反馈音。
- 条件：设备处于维护中或不可售水状态。操作：用户尝试进行取水操作。结果：设备播放"设备维护中，请稍后再试"阻断提示语音。
- 条件：设备处于缺水状态。操作：用户尝试进行取水操作。结果：设备播放"设备当前缺水，请稍后再试"阻断提示语音。
- 条件：设备离线超过6分钟。操作：用户尝试进行取水操作。结果：设备播放"设备已离线，请稍后再试"阻断提示语音。
- 语音播报设置参数为 0x02 或 0x03 时，所有语音均不播报，包括阻断提示语音。

**配置参数**

沿用 5.6.4 设备可配置参数清单中的语音播报设置参数（Data[30]）：

| 参数 | Data位置 | 默认值 | 取值 | 说明 |
|-----|---------|-------|------|------|
| 语音播报设置 | [30] | 1（播报） | 0x01/0x02/0x03 | 0x01播报，0x02关闭语音，0x03关闭所有语音 |
| 喇叭音量 | [39] | 80 | 0-100 | 0为静音，与语音播报开关独立（具体参数待供应商确认后调整） |

- 系统管理员可通过远程配置下发修改此参数。
- 参数修改后立即生效，无需设备重启。
- 设备恢复出厂设置后，语音播报参数恢复为默认值（0x01 播报）。

**播报节点清单**

以下播报节点按用户取水主链路排序，覆盖从待机到取水结果的全流程。

| 序号 | 所属页面 | 触发时机 | 播报类型 | 中文 | English | ภาษาไทย | 日本語 | 한국어 | Русский |
|-----|---------|---------|---------|------|---------|---------|--------|--------|---------|
| 1 | 待机页 | 用户切换语言时立即播报；未切换语言则在点击"开始取水"时播报 | 引导 | 欢迎使用Drovio智能售水机 | Welcome to Drovio. | ยินดีต้อนรับสู่ Drovio | Drovioへようこそ。 | Drovio에 오신 것을 환영합니다. | Добро пожаловать в Drovio. |
| 2 | 支付方式页 | 进入支付方式选择 | 引导 | 请选择您的支付方式 | Please select your payment method. | กรุณาเลือกวิธีชำระเงินของคุณ | お支払い方法を選択してください。 | 결제 수단을 선택해 주세요. | Пожалуйста, выберите способ оплаты. |
| 3 | IC卡刷卡页 | 进入刷卡提示 | 引导 | 请将IC卡放置在感应区 | Please place your IC card on the reader. | กรุณาวางบัตร IC บนเครื่องอ่าน | ICカードをリーダーに置いてください。 | IC카드를 리더기에 올려 놓아 주세요. | Приложите карту к считывателю. |
| 4 | IC卡刷卡页 | 刷卡成功 | 成功 | 刷卡成功 | Card read successfully. | อ่านบัตรสำเร็จ | カード読み取り成功 | 카드 인식 성공 | Карта считана успешно. |
| 5 | IC卡异常页 | 刷卡失败或卡不可用 | 错误 | 刷卡失败，请重试或选择其他支付方式 | Card read failed. Please retry or choose another method. | อ่านบัตรไม่สำเร็จ กรุณาลองใหม่หรือเลือกวิธีอื่น | カード読み取り失敗。再試行するか他の方法をお選びください。 | 카드 인식 실패. 다시 시도하거나 다른 결제 수단을 선택해 주세요. | Ошибка чтения карты. Попробуйте ещё раз или выберите другой способ оплаты. |
| 6 | LINE Pay登录二维码页 | 进入扫码登录 | 引导 | 请使用LINE扫描二维码登录 | Please scan the QR code with LINE to log in. | กรุณาสแกน QR code ด้วย LINE เพื่อเข้าสู่ระบบ | LINEでQRコードをスキャンしてログインしてください。 | LINE으로 QR코드를 스캔하여 로그인해 주세요. | Отсканируйте QR-код в LINE для входа. |
| 7 | 登录成功页 | LINE Pay登录成功 | 成功 | 登录成功，请在手机上完成支付 | Login successful. Please complete payment on your phone. | เข้าสู่ระบบสำเร็จ กรุณาชำระเงินบนมือถือ | ログイン成功。お手数ですがスマホでお支払いを完了してください。 | 로그인 성공. 휴대폰에서 결제를 완료해 주세요. | Вход выполнен. Завершите оплату на телефоне. |
| 8 | 补差二维码页 | IC卡余额不足，进入补差 | 引导 | 您的余额不足，请扫码补差 | Insufficient balance. Please scan to pay the difference. | ยอดเงินไม่เพียงพอ กรุณาสแกนเพื่อชำระส่วนต่าง | 残高不足です。QRコードをスキャンして差額をお支払いください。 | 잔액이 부족합니다. QR코드를 스캔하여 차액을 결제해 주세요. | Недостаточно средств. Отсканируйте QR-код для доплаты. |
| 9 | 扫码支付页（Alipay） | 进入Alipay扫码 | 引导 | 请使用支付宝扫描二维码支付 | Please scan the QR code with Alipay to pay. | กรุณาสแกน QR code ด้วย Alipay เพื่อชำระเงิน | AlipayでQRコードをスキャンしてお支払いください。 | Alipay로 QR코드를 스캔하여 결제해 주세요. | Отсканируйте QR-код в Alipay для оплаты. |
| 10 | 扫码支付页（WeChat Pay） | 进入WeChat Pay扫码 | 引导 | 请使用微信扫描二维码支付 | Please scan the QR code with WeChat to pay. | กรุณาสแกน QR code ด้วย WeChat เพื่อชำระเงิน | WeChatでQRコードをスキャンしてお支払いください。 | WeChat으로 QR코드를 스캔하여 결제해 주세요. | Отсканируйте QR-код в WeChat для оплаты. |
| 11 | 支付成功页 | 支付成功进入放桶提示 | 成功 | 支付成功，请放好水桶 | Payment successful. Please place your container. | ชำระเงินสำเร็จ กรุณาวางภาชนะ | お支払い完了。容器を設置してください。 | 결제 성공. 용기를 놓아 주세요. | Оплата прошла. Поставьте ёмкость. |
| 12 | 出水页 | 开始出水 | 提示 | 正在取水中，请稍后 | Dispensing water. Please wait. | กำลังจ่ายน้ำ กรุณารอสักครู่ | 給水中です。お待ちください。 | 물 받는 중입니다. 잠시만 기다려 주세요. | Набор воды. Пожалуйста, подождите. |
| 13 | 出水页 | 用户暂停出水 | 提示 | 出水已暂停，请在3分钟内操作 | Dispensing paused. Please act within 3 minutes. | หยุดจ่ายน้ำชั่วคราว กรุณาดำเนินการภายใน 3 นาที | 給水を一時停止しました。3分以内に操作してください。 | 급수가 일시 정지되었습니다. 3분 이내에 조작해 주세요. | Набор воды приостановлен. Продолжите в течение 3 минут. |
| 14 | 出水页 | 用户点击继续出水 | 提示 | 继续取水 | Resuming dispensing. | จ่ายน้ำต่อ | 給水を再開します。 | 급수를 재개합니다. | Набор воды продолжается. |
| 15 | 取水结果页 | 完整出水完成 | 感谢 | 取水完成，感谢您的使用 | Dispensing complete. Thank you for using Drovio. | จ่ายน้ำเสร็จสิ้น ขอบคุณที่ใช้บริการ | 給水完了。ご利用ありがとうございました。 | 급수 완료. 이용해 주셔서 감사합니다. | Набор завершён. Спасибо за использование Drovio. |
| 16 | 取水结果页 | 用户主动停止或暂停超时（部分出水） | 提示 | 取水已停止，退款将原路返回，感谢您的使用 | Dispensing stopped. Refund will be processed. Thank you. | หยุดจ่ายน้ำ ระบบจะคืนเงิน ขอบคุณที่ใช้บริการ | 給水を停止しました。返金は元の方法で処理されます。ありがとうございました。 | 급수가 중지되었습니다. 환불이 처리됩니다. 감사합니다. | Набор воды остановлен. Средства будут возвращены. Спасибо. |
| 17 | 待机页 | 用户尝试操作，设备处于维护中或不可售水状态 | 阻断 | 设备维护中，请稍后再试 | Device under maintenance. Please try again later. | อุปกรณ์อยู่ระหว่างบำรุงรักษา กรุณาลองใหม่ภายหลัง | メンテナンス中です。後ほどお試しください。 | 장비 점검 중입니다. 나중에 다시 시도해 주세요. | Оборудование на обслуживании. Попробуйте позже. |
| 18 | 待机页 | 用户尝试操作，设备缺水 | 阻断 | 设备当前缺水，请稍后再试 | Device is out of water. Please try again later. | อุปกรณ์น้ำหมด กรุณาลองใหม่ภายหลัง | 現在水がありません。後ほどお試しください。 | 장비에 물이 없습니다. 나중에 다시 시도해 주세요. | Вода закончилась. Попробуйте позже. |
| 19 | 支付成功页 | 支付成功后超过5分钟未确认放桶，系统自动取消订单 | 提示 | 您的订单已取消，退款将原路返回 | Your order has been cancelled. Refund will be processed. | คำสั่งซื้อถูกยกเลิก ระบบจะคืนเงิน | ご注文がキャンセルされました。返金は元の方法で処理されます。 | 주문이 취소되었습니다. 환불이 처리됩니다. | Ваш заказ отменён. Средства будут возвращены. |
| 20 | 待机页 | 用户尝试操作，设备离线超过6分钟 | 阻断 | 设备已离线，请稍后再试 | Device is offline. Please try again later. | อุปกรณ์ออฟไลน์ กรุณาลองใหม่ภายหลัง | デバイスがオフラインです。後ほどお試しください。 | 장비가 오프라인입니다. 나중에 다시 시도해 주세요. | Оборудование не в сети. Попробуйте позже. |

**多语言规则**

- 柜机语音播报支持中文、英文、泰文、日文、韩文、俄文 6 种语言。
- 播报语言跟随用户在待机页选择的语言，选定后贯穿整个取水流程，不跟随系统管理员配置。
- 语言资源缺失或播报文案未定义时，默认按泰文回退。
- 同一设备在同一时间段内仅使用一种播报语言。
- 用户切换语言后，后续播报立即切换到对应语言。

**与现有流程的关联**

与 5.1 用户取水流程的关联：

| 取水流程环节 | 触发播报节点 | 播报序号 |
|------------|------------|---------|
| 用户在柜机待机页 | 用户触碰屏幕唤醒 | 1 |
| 用户在待机页切换语言 | 切换语言时立即播报 | 1 |
| 设备处于维护中或不可售水状态，用户尝试操作 | 维护阻断提示 | 17 |
| 设备处于缺水状态，用户尝试操作 | 缺水阻断提示 | 18 |
| 设备离线超过6分钟，用户尝试操作 | 离线阻断提示 | 20 |
| 支付成功后超时未取水，系统自动取消订单 | 订单取消提示 | 19 |
| 柜机进入支付方式页 | 进入支付方式选择 | 2 |
| 用户选择IC卡，进入刷卡提示页 | 进入刷卡提示 | 3 |
| IC卡刷卡成功 | 刷卡成功 | 4 |
| IC卡刷卡失败或卡不可用 | 刷卡失败 | 5 |
| 用户选择LINE Pay，展示登录二维码 | 进入扫码登录 | 6 |
| LINE Pay登录成功 | 登录成功 | 7 |
| IC卡余额不足，展示补差二维码 | 进入扫码补差 | 8 |
| 用户选择Alipay，展示扫码支付二维码 | 进入Alipay扫码 | 9 |
| 用户选择WeChat Pay，展示扫码支付二维码 | 进入WeChat Pay扫码 | 10 |
| 支付成功，展示放桶提示 | 支付成功 | 11 |
| 用户确认放桶，开始出水 | 开始出水 | 12 |
| 用户暂停出水 | 暂停出水 | 13 |
| 用户继续出水 | 继续出水 | 14 |
| 出水正常完成 | 取水完成 | 15 |
| 用户主动停止或暂停超时（部分出水） | 取水已停止 | 16 |

与 5.6.1 远程控制的关联：

- 系统管理员可通过远程配置下发修改语音播报设置参数（Data[30]）。
- 设备在线时，配置下发后立即生效。
- 设备离线时，配置下发被系统拒绝，生成失败记录（失败原因：设备离线）。
- 远程控制指令单条执行，语音播报配置下发不影响其他控制指令。

与 5.6.4 设备参数配置的关联：

- 语音播报设置参数（Data[30]）纳入设备可配置参数清单。
- 所有设备参数均支持远程下发。
- 设备恢复出厂设置后，语音播报参数恢复为默认值（0x01 播报）。

**验收标准**

语音播报验收标准已整合至第 8.8 节，此处不重复列出。

#### 5.6.11 实体按钮通信协议

**功能定义**

柜机硬件配备绿色和红色两个实体按钮，用户通过物理按键控制出水动作。按钮信号由水机板直接接收并执行，再将状态变更上报主控板（4G模块）同步屏幕。

**按钮定义**

| 按钮 | 颜色 | 功能 | 生效场景 |
|------|------|------|---------|
| 开始/继续按钮 | 绿色 | 开始取水或继续出水 | 支付成功页、出水暂停状态 |
| 暂停按钮 | 红色 | 暂停出水 | 出水状态（含远程放水出水状态） |

**通信链路**

```
实体按钮（用户按下）
    ↓
水机板（接收信号 + 执行动作）
    ↓  状态上报
主控板 / 4G模块（接收状态 + 更新屏幕）
    ↓  状态同步（已有通道）
云端服务（同步 C 端状态）
```

**水机板上报状态枚举**

| 状态码 | 含义 | 触发条件 |
|--------|------|---------|
| START_DISPENSING | 开始取水 | 绿色按钮按下（支付成功阶段） |
| DISPENSING_PAUSED | 出水已暂停 | 红色按钮按下（出水中） |
| DISPENSING_RESUMED | 出水已继续 | 绿色按钮按下（暂停态） |

**主控板收到状态后的动作**

| 收到状态 | 主控板动作 |
|---------|-----------|
| START_DISPENSING | 从支付成功页跳转到出水页 |
| DISPENSING_PAUSED | 出水屏幕切换到暂停状态（橙色背景 + 倒计时 + 继续/停止按钮） |
| DISPENSING_RESUMED | 出水屏幕切换到出水状态（蓝色背景 + 进度条） |

**各页面行为矩阵**

| 页面 | 绿色按钮 | 红色按钮 |
|------|---------|---------|
| 支付成功页 | 开始取水 → 跳转出水页 | 无反应 |
| 出水页 — 出水中 | 无反应 | 暂停出水，屏幕同步切换暂停状态 |
| 出水页 — 暂停态 | 继续出水，屏幕同步切换出水状态 | 无反应 |
| 远程控制放水 — 出水中 | 无反应 | 暂停放水 |
| 远程控制放水 — 已暂停 | 继续放水 | 无反应 |

**边界条件**

| 场景 | 处理方式 |
|------|---------|
| 出水中按绿色按钮 | 忽略 |
| 暂停态按红色按钮 | 忽略 |
| 支付成功页按红色按钮 | 忽略 |
| 暂停倒计时3分钟内按绿色 | 继续出水，倒计时重置 |
| 暂停倒计时超时后按绿色 | 已自动停止，绿色按钮无效 |
| 远程放水期间按实体按钮 | 允许，与取水场景行为一致 |
| 设备离线/维护/关机状态 | 实体按钮无效（水机板不执行） |

**停止出水说明**

停止出水仅通过柜机屏幕按钮操作，实体按钮不覆盖此功能。原因：停止出水涉及退款计算和二次确认，需柜机屏幕展示退款明细。

**远程放水期间实体按钮交互**

远程放水期间允许实体按钮操作（暂停/继续），控制记录需跟踪暂停状态：

| 场景 | 控制记录状态变更 | 说明 |
|------|----------------|------|
| 远程放水进行中 + 用户按红色按钮 | 执行中 → 已暂停 | 控制记录更新为"已暂停"，记录暂停时间 |
| 已暂停 + 用户按绿色按钮 | 已暂停 → 执行中 | 控制记录恢复"执行中"，记录继续时间 |
| 已暂停 + 3分钟超时 | 已暂停 → 成功(部分) | 自动停止，记录实际出水量，控制记录标记"成功(部分)" |
| 已暂停 + 用户屏幕点击停止 | 已暂停 → 成功(部分) | 手动停止，记录实际出水量 |

- 实体按钮的暂停/继续操作均写入控制记录操作日志。
- 远程放水指令状态从4种扩展为5种：待执行 / 执行中 / 已暂停 / 成功 / 失败。
- "成功(部分)"表示远程放水被中途停止但有实际出水量，详情弹窗展示暂停次数和实际出水量。

**与语音播报的关联**

实体按钮触发的状态变更复用现有语音播报节点，无需新增节点：

| 实体按钮操作 | 复用播报节点 | 播报内容 |
|-------------|------------|---------|
| 绿色按钮开始取水 | 节点12 | "正在取水中，请稍后" |
| 红色按钮暂停出水 | 节点13 | "出水已暂停，请在3分钟内操作" |
| 绿色按钮继续出水 | 节点14 | "继续取水" |

**验收标准**

见 §8.2 取水支付。

### 5.7 机主协同流程（P2 预留）

本节保留需求目标与流程定义，不纳入当前 P1 / MVP 核心流程与验收。

**流程目标**  
让机主在不进入资金域的前提下，完成设备查看、报修协同、工单跟进、公告接收和 IC 卡管理。

**触发条件**  
机主进入机主端处理本人设备相关业务。

**参与角色与对象**  
机主、运维、系统后端。

**前置条件**

- 设备已绑定到对应机主。
- 机主具备对应业务权限。

本流程用于表达机主端协同范围，不要求所有动作按固定顺序连续发生。

**主流程**

1. 机主查看本人设备、状态和最近协同信息。
2. 机主发现问题后发起报修，系统先校验是否存在未关闭的重复工单。
3. 校验通过后，系统后端生成工单并自动派发给对应运维；若命中重复工单，机主改为查看已有工单。
4. 机主可在规则允许范围内取消本人发起且运维尚未开始处理的报修工单。
5. 工单进入处理中后，机主持续查看处理进展和处理结果。
6. 机主接收系统管理员已发布的公告与业务通知。
7. 机主在权限范围内执行 IC 卡发卡、充值和台账查看。

**关键分支**

- 报修取消、重复工单校验与执行边界口径以 §5.8 工单协同规则为准。
- 公告接收与语言展示口径以 §4.7 内容触达与多语言规则为准。
- IC 卡权限边界以 4.4 IC 卡业务规则为准。

**流程结果**

- 机主完成设备协同和信息查看。
- 报修需求进入可跟踪的工单闭环。
- 公告触达和 IC 卡管理动作形成可追溯记录。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["机主进入机主端"] --> B["查看本人设备与状态"]
    B --> C{"是否发起报修"}
    C -->|"是"| D["提交报修"]
    D --> E["系统校验是否存在未关闭重复工单"]
    E --> F{"是否可创建工单"}
    F -->|"是"| G["系统后端生成并自动派发工单"]
    G --> H["工单进入已派单"]
    H --> I["机主跟踪工单进展"]
    F -->|"否"| J["引导查看已有工单"]
    C -->|"否"| K["接收公告与业务通知"]
    I --> K
    J --> K
    K --> L["在权限范围内管理 IC 卡"]
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor O as 机主
    actor M as 运维
    participant S as 系统后端

    O->>S: 查看本人设备与状态

    opt 发起报修
        O->>S: 提交报修
        alt 命中未关闭重复工单
            S-->>O: 阻断新建并引导查看已有工单
        else 校验通过
            S->>S: 创建工单并自动派发
            S-->>M: 推送新工单
            S-->>O: 返回工单已创建
            Note over S,M: 工单状态更新为已派单
            alt 机主在运维开始前取消
                O->>S: 申请取消本人报修工单
                S->>S: 校验取消条件
                S-->>O: 返回已关闭
            else 运维开始处理
                M->>S: 接收工单
                S-->>O: 同步处理中状态
                M->>S: 开始处理工单
                S-->>O: 同步处理进展
                M->>S: 提交处理结果
                S-->>O: 同步已完成或已关闭结果
            end
        end
    end

    opt 接收公告与业务通知
        S-->>O: 推送公告与业务通知
    end

    opt IC 卡管理
        O->>S: 发卡、充值或查看台账
        S-->>O: 返回处理结果
        Note over O,S: 机主仅可管理本人发出的 IC 卡；停用与启用由系统管理员在 5.4 IC 卡管理流程中执行
    end
```

### 5.8 运维工单流程（P2 预留）

本节保留需求目标、业务规则与流程定义，不纳入当前 P1 / MVP 核心流程与验收。

**业务规则**

**工单创建与派发**

- 工单来源包括主动告警和系统管理员人工建单；机主报修为 P2 预留。
- 工单创建后由系统后端按服务区域自动派发给对应运维。
- **条件：** 设备触发外部水源无水、流量计故障、设备离线（超过 30 分钟）、滤芯已过期、长时间水位过低任一异常。<br>**操作：** 系统自动生成工单并按服务区域自动派发给运维。<br>**结果：** 工单进入已派单。若该区域无对应运维，工单进入待派发状态并通知管理员手动指派。
- **条件：** 同一设备、同一异常类型已存在未关闭工单。<br>**操作：** 系统不重复生成新工单。<br>**结果：** 原工单持续承接本次异常处理。

**工单处理**

- **条件：** 运维点击接收工单。<br>**操作：** 系统更新工单状态。<br>**结果：** 工单由已派单更新为处理中。
- **条件：** 设备出水异常同时影响用户取水订单。<br>**操作：** 设备侧进入报警工单处理链路，订单侧进入 §5.3 异常订单与售后流程。<br>**结果：** 设备维修与用户售后分别闭环。
- 当前方案暂不做转派，不做签到。
- 机主报修取消、查看进展与报修协同相关规则为 P2 预留。
- 运维负责执行，不承担系统管理员侧规则配置职责。

**工单恢复与关闭**

- **设备离线恢复：** 设备恢复在线后，工单自动关闭（离线为网络问题，无硬件隐患）。
- **硬件告警恢复：** 外部水源无水、流量计故障恢复后，工单保留不自动关闭，系统推送通知给运维确认后手动关闭（硬件故障需现场确认根治）。
- **滤芯已过期：** 不适用自动恢复，必须运维更换滤芯后手动关闭工单。
- **长时间水位过低恢复：** 水位回到非低状态后，工单自动关闭。
- **待派发工单：** 工单处于待派发状态（区域无运维）时设备恢复，工单自动关闭。

**流程目标**  
完成从异常触发、工单生成、工单处理到完工关闭的执行闭环。

**触发条件**  
发生设备异常或系统管理员人工建单。

**参与角色与对象**  
运维、系统管理员、系统后端。

**前置条件**

- 已满足工单创建条件。
- 已存在服务区域与分配规则。
- 已定义设备异常报警类型，包括外部水源无水、流量计故障、设备离线（超过 30 分钟）、滤芯已过期、长时间水位过低（见 §5.6.9 告警类型表）。

**设备异常报警触发阈值与恢复条件**

| 异常类型 | 触发条件 | 恢复条件 |
|----------|---------|---------|
| 外部水源无水 | 无原水进入水路（外部水源状态=无水源） | 水源恢复自动恢复 |
| 流量计故障 | 流量计异常 | 故障解除自动恢复 |
| 设备离线 | 超过 6 分钟无心跳上报，超过 30 分钟触发工单 | 设备恢复在线后自动恢复 |
| 滤芯已过期 | 滤芯使用天数达最高寿命 80% 时预警，100% 时告警 | 更换滤芯后重置使用天数，自动恢复 |
| 长时间水位过低 | 设备持续处于低水位状态超过 1 小时（低液位浮球触发后计时） | 水位回到非低状态后自动恢复 |

**主流程**

1. 告警或系统管理员人工建单触发工单。
2. 设备告警触发时，系统后端识别异常并自动生成工单；系统管理员人工建单时，系统后端按规则生成工单。
3. 系统后端按服务区域自动派发工单，工单进入已派单。
4. 运维接收工单，工单状态更新为处理中。
5. 运维开始处理后执行维修并回填处理结果。
6. 运维提交完工结果，或按规则提交关闭结果。
7. 系统后端更新工单状态，工单完成闭环。

**关键分支**

- 工单来源、自动派发与执行边界以本节业务规则为准。
- 无效工单或误报工单可按规则关闭。
- 同一设备、同一异常类型在原工单未关闭前，不重复生成新工单。
- 设备出水异常同时影响取水订单时，设备工单链路与订单售后链路并行处理。
- 工单恢复与关闭规则以本节"工单恢复与关闭"规则为准。

**流程结果**

- 工单处理完成。
- 工单按规则关闭。
- 与工单相关的处理动作形成留痕。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["异常触发或系统管理员人工建单"] --> B{"同一设备同一异常是否存在未关闭工单"}
    B -->|"是"| C["不新建工单，沿用原工单链路"]
    B -->|"否"| D["系统后端生成工单"]
    D --> E["按服务区域自动派发"]
    E --> F["工单进入已派单"]
    F --> G["运维接收工单"]
    C --> G
    G --> H["工单进入处理中"]
    H --> I["维修并回填结果"]
    I --> L["提交完工或关闭"]
    L --> M["工单闭环"]
```

**角色时序图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor M as 运维
    participant S as 系统后端

    alt 告警触发建单
        S->>S: 识别异常并自动建单
        S-->>M: 按服务区域自动派发工单
        Note over S,M: 工单状态更新为已派单
    else 系统管理员人工建单
        A->>S: 人工创建工单
        S-->>M: 推送新工单
        Note over S,M: 工单状态更新为已派单
    end

    M->>S: 接收工单
    M->>S: 开始处理工单

    alt 正常完工
        M->>S: 提交完工结果
    else 无效或误报关闭
        M->>S: 提交关闭结果
    end
```

### 5.9 仓储与设备流转流程（P2 预留）

本节保留需求目标与流程定义，不纳入当前 P1 / MVP 核心流程与验收。
原 §4.7 仓储与设备流转规则已合并至本节。

**流程目标**
完成设备与高价值配件从建档到报废的全生命周期管理，实现四种流转类型（投放出库、回收入库、直接转移、跨仓调拨）的完整闭环；完成工单相关配件与耗材的领用归还闭环；保证资产状态、仓储台账和业务记录一致。

**触发条件**
发生设备建档入库、投放出库、回收入库、直接转移、跨仓调拨、现场维修、工单配件耗材领用归还、报废相关业务。

**参与角色与对象**
系统管理员、仓库管理员、运维、系统后端。

**前置条件**

- 基础档案已新增或批量导入。
- 仓库具备基础在库管理能力。
- 设备和高价值配件采用二维状态模型，普通配件和耗材按数量管理。

---

#### 5.9.1 设备与高价值配件状态模型

设备、高价值配件（屏幕/主板）和滤芯共用同一套二维状态模型。
高价值配件仅包含屏幕和主板 2 种（一物一码管理，编码规则见 §5.9.4）。
普通配件（摄像头/喇叭等）按数量管理，不涉及状态流转。
滤芯自本版起纳入一物一码管理，入库独立建档不与设备绑定，现场安装时由运维扫码绑定到设备（编码规则见 §5.9.4）。

**主状态（4种）** — 描述资产在哪里：

| 主状态 | 含义 | 触发动作 |
|--------|------|---------|
| 库存中 | 在仓库中，计入库存 | 入库确认 |
| 运输中 | 已出库，运输途中（含出库配送、回收运输、跨仓调拨） | 出库确认 / 运维拆卸确认 |
| 使用中 | 在现场运营 | 运维确认安装完成 |
| 已报废 | 不可继续使用 | 报废执行确认 |

**二级状态（仅库存中）** — 描述资产什么情况：

| 二级状态 | 含义 |
|----------|------|
| 可投放 | 正常可用，可出库 |
| 故障 | 有问题，待修或待报废 |

**合法组合（5种）：**

| 主状态 | 二级状态 | 含义 |
|--------|---------|------|
| 库存中 | 可投放 | 在仓库，正常可用 |
| 库存中 | 故障 | 在仓库，待修或待报废 |
| 运输中 | — | 运输途中 |
| 使用中 | — | 在现场运营 |
| 已报废 | — | 已处置 |

**库存定义**：库存中·可投放 + 库存中·故障。已报废、运输中、使用中不计入库存。

**核心原则**：
- 现场可维修：运维到场尝试修复，修好则恢复运营；修不好则走回收入库流程，由仓库管理员标记二级状态。
- 资产状态与运营状态（网络/运行/可售水）完全独立，设备进入"维护中"运行状态时不可售水，与资产状态无关。
- 创建流转单不改资产状态，状态变更只在物理动作确认时触发。

**流转路径总览：**

| 状态变更 | 流转类型 | 触发动作 |
|---------|---------|---------|
| 库存中·可投放 → 运输中 | 投放出库 / 跨仓调拨 | 仓库管理员出库确认 |
| 运输中 → 使用中 | 投放出库 / 直接转移 | 运维现场安装确认 |
| 使用中 → 运输中 | 直接转移 / 回收入库 | 运维拆卸取走 |
| 运输中 → 库存中 | 回收入库 / 跨仓调拨 | 仓库管理员验收入库，标记二级状态 |
| 库存中·故障 → 库存中·可投放 | 仓库内维修 | 仓管确认维修完成 |
| 库存中·故障 → 已报废 | — | 仓管发起报废，管理员审批后执行 |
| 已报废 | 终态（P2 不可逆） | 报废执行确认 |

---

#### 5.9.2 一物一码资产全生命周期

以下时序图展示一物一码资产（设备/屏幕/主板/滤芯）从建档到报废的完整生命周期，按角色泳道组织。

补充流程（现场维修、配件现场更换、备件独立领用归还）不在此图中展开，详见各流程对应章节标注。

**校验规则汇总：**
- **入库校验：** 仓管扫码绑定设备配件（屏幕/主板），数量 = 型号标准配置模板（§5.9.5），不符则标记异常通知管理员，不阻断入库；滤芯独立入库，不参与设备绑定校验
- **出库校验：** 设备状态=库存中·可投放 + 配件状态=库存中·可投放 + 配件数量=模板 + 滤芯独立出库数量=模板（支持箱码批量/逐根扫码，不做出库前绑定校验），任一不满足则阻断出库
- **回收核验：** 逐件扫描设备配件码（屏幕/主板）与系统记录对比；滤芯支持箱码批量扫描（二次确认可修改）或逐根扫码核验；目视检查摄像头有/无
- **报废审批：** 一物一码资产（设备/屏幕/主板/滤芯）需审批；普通配件无需审批；设备报废时系统自动解除关联屏幕/主板，仓管逐件选择状态（可投放/故障）；滤芯不与设备绑定，独立发起报废审批

```mermaid
sequenceDiagram
    autonumber
    participant SA as 系统管理员
    participant SYS as 系统
    participant WM as 仓库管理员
    participant OP as 运维

    rect rgb(235, 245, 255)
    Note over SA, OP: 一、建档入库（§5.9.3）
    SA->>SYS: 新建设备/配件/滤芯档案<br>（编码字段=待入库确认，编码在入库验收时确定）
    Note right of SYS: 建档即「库存中」
    SA->>SYS: 发起首次入库
    WM->>SYS: 扫描设备码确认
    WM->>SYS: 拆机扫描屏幕码（SN-P，无码则系统生成+打印标签）→ 绑定到设备
    WM->>SYS: 扫描主板码（SN-Z，无码则系统生成+打印标签）→ 绑定到设备
    SYS-->>WM: 校验配件数量 = 型号标准配置模板（§5.9.5）
    WM->>SYS: 标记二级状态（可投放 / 故障）
    Note right of SYS: 设备状态=库存中·可投放/故障<br>建立设备-配件关联记录
    WM->>SYS: 滤芯入库：箱码批量扫描（二次确认可修改）或逐根扫描（SN-L，无码则系统生成+打印标签）
    Note right of SYS: 滤芯独立建档入库，不绑定设备
    end

    rect rgb(240, 255, 240)
    Note over SA, OP: 二、投放出库（§5.9.6）
    SA->>SYS: 创建出库单（填写投放位置）
    SYS-->>SA: 校验设备状态+配件状态+数量=模板
    WM->>SYS: 出库确认（扫码核验设备+配件+滤芯）
    Note right of SYS: 库存中 → 运输中
    OP->>SYS: 现场安装确认
    Note right of SYS: 运输中 → 使用中
    end

    Note over OP: 使用中<br>（维修/更换见 §5.9.10/§5.9.11）

    rect rgb(255, 245, 235)
    Note over SA, OP: 三、回收入库（§5.9.7）
    SA->>SYS: 创建回收单
    OP->>SYS: 现场拆卸取走设备
    Note right of SYS: 使用中 → 运输中
    WM->>SYS: 逐件扫描屏幕/主板码核验；滤芯箱码/逐根扫码核验
    WM->>SYS: 目视检查摄像头有/无状态
    WM->>SYS: 标记二级状态（可投放 / 故障）
    Note right of SYS: 运输中 → 库存中
    end

    rect rgb(245, 235, 255)
    Note over SA, OP: 四、跨仓调拨（§5.9.9）<br>高价值配件随设备一起调拨，关联关系不变；滤芯独立管理
    SA->>SYS: 创建调拨单（指定源仓库和目标仓库）
    WM->>SYS: 源仓出库确认
    Note right of SYS: 库存中 → 运输中
    WM->>SYS: 目标仓入库验收（标记二级状态）
    Note right of SYS: 运输中 → 库存中，归属变更为目标仓库
    end

    rect rgb(235, 255, 250)
    Note over SA, OP: 五、直接转移（§5.9.8）<br>不经过仓库，设备仓库归属不变
    SA->>SYS: 创建转移单（填写目标位置）
    OP->>SYS: 现场拆卸取走设备
    Note right of SYS: 使用中 → 运输中
    OP->>SYS: 新位置安装确认
    Note right of SYS: 运输中 → 使用中
    end

    rect rgb(255, 240, 240)
    Note over SA, OP: 六、报废（§5.9.12）
    WM->>SYS: 发起报废申请（填写报废原因）
    SYS-->>WM: 校验：资产状态 = 库存中·故障
    SA->>SYS: 审批报废申请
    Note right of SA: 系统管理员自行发起时<br>无需审批，直接执行
    WM->>SYS: 执行报废
    SYS-->>WM: 关联屏幕/主板：系统自动解除关联<br>仓管逐件选择状态（可投放/故障）<br>滤芯独立报废，无需解除关联
    Note right of SYS: 库存中·故障 → 已报废
    end

    rect rgb(240, 240, 240)
    Note over SA, OP: 七、仓库维修（§5.9.10）
    WM->>SYS: 确认维修完成
    Note right of SYS: 库存中·故障 → 库存中·可投放
    end
```

**补充流程引用：**
- 使用中设备的现场维修：详见 §5.9.10
- 使用中设备的配件/滤芯现场更换：详见 §5.9.11
- 基于工单的备件独立领用归还：详见 §5.9.14
- 编码规则与重复码检测：详见 §5.9.4
- 普通配件（摄像头/喇叭等）报废无需审批：详见 §5.9.13

---

#### 5.9.3 建档入库

1. 系统管理员新增或批量导入设备、高价值配件（屏幕/主板）、普通配件（摄像头/喇叭等）和耗材基础档案。设备和高价值配件的资产编码（SN-{G/P/Z/L}）不在建档时分配，编码字段显示「待入库确认」；编码由仓库管理员在入库验收时确定（§5.9.4）。普通配件和耗材由系统管理员直接录入数量。
2. 设备和高价值配件建档即进入「库存中」状态，编码字段为「待入库确认」，入库验收确认后编码字段更新为正式 SN 编码，库存统计包含编码待确认的设备；滤芯建档后独立进入库存中状态，不与设备绑定；普通配件和耗材进入待确认入库口径。
3. 系统管理员发起首次入库。
4. 仓库管理员执行首次入库确认：
   - 设备及内置配件：按以下顺序逐件扫码，每步有码扫码、无码系统生成 SN 编码后打印标签粘贴再扫码确认：

     | 顺序 | 操作对象 | 扫码/生成 | 标签位置 |
     |------|---------|----------|---------|
     | 1 | 设备 | SN-G | 设备金属铭牌旁 |
     | 2 | 屏幕 | SN-P（需拆机） | 屏幕本体 |
     | 3 | 主板 | SN-Z（需拆机） | 主板本体 |

     扫码完成后：系统校验配件数量与型号标准配置一致 → 仓管标记二级状态（可投放/故障）→ 拍照留证（非必填）。
   - 滤芯（独立入库）：支持两种扫码方式：
     - **箱码批量扫描：** 扫描供应商箱码 → 系统展示箱内全部滤芯 SN+规格明细 → 仓管二次确认（可修改数量和明细）→ 批量入库建档。支持单规格箱和多规格混箱。
     - **逐根扫码：** 逐根扫描滤芯码（SN-L），有码扫码、无码系统生成 SN 编码后打印标签粘贴再扫码确认。
   - 普通配件和耗材：按数量确认。
   - 数量不符时标记异常通知管理员，不阻断入库流程。
5. 系统后端记录资产编码，更新设备和高价值配件状态为「库存中」并记录二级状态，建立设备-配件关联记录；滤芯独立建档入库，记录所属仓库；普通配件和耗材增加在库数量，生成仓储台账。
6. 首次入库确认不通过时，返回对应建档或确认环节重新处理。

详见流程图 A、角色时序图 A。

---

**流程图 A：基础档案建档与首次入库**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["系统管理员新增或批量导入基础档案（编码字段=待入库确认）"] --> A1["设备/高价值配件建档即库存中；滤芯独立建档入库；普通配件/耗材待确认入库"]
    A1 --> B["发起首次入库"]
    B --> C{"对象类型"}
    C -->|"设备"| D["仓管扫描设备码 → 扫描配件码绑定 → 校验标准配置 → 滤芯箱码/逐根独立入库"]
    C -->|"普通配件或耗材"| E["仓库管理员按数量确认入库"]
    D --> D1{"是否确认通过"}
    D1 -->|"是"| F["系统后端生成库存记录、关联记录与台账"]
    D1 -->|"否"| J["返回建档或确认环节重新处理"]
    F --> G["设备入库完成，状态=库存中，配件已绑定，滤芯独立入库，仓管标记二级状态"]
    E --> E1{"是否确认通过"}
    E1 -->|"是"| H["系统后端增加库存数量并记录台账"]
    E1 -->|"否"| J
    H --> I["普通配件或耗材入库完成，库存增加"]
```

**角色时序图 A：基础档案建档与首次入库**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor W as 仓库管理员
    participant S as 系统后端

    A->>S: 新增或批量导入基础档案
    S->>S: 设备和高价值配件建档即库存中
    A->>S: 发起首次入库
    alt 设备或高价值配件
        S-->>W: 生成扫码入库任务
        W->>S: 扫码确认入库
        alt 确认通过
            S->>S: 更新状态为库存中并记录台账
            W->>S: 标记二级状态（可投放/故障）
        else 确认不通过
            S-->>A: 返回建档或确认环节重新处理
        end
    else 普通配件或耗材
        S-->>W: 生成数量入库任务
        W->>S: 确认入库数量
        alt 确认通过
            S->>S: 增加库存数量并记录台账
        else 确认不通过
            S-->>A: 返回建档或确认环节重新处理
        end
    else 滤芯
        S-->>W: 生成滤芯入库任务
        W->>S: 箱码批量扫描或逐根扫码（SN-L，无码则系统生成+打印标签）
        alt 确认通过
            S->>S: 滤芯独立建档入库，记录所属仓库
            W->>S: 二次确认（箱码模式可修改数量和明细）
        else 确认不通过
            S-->>A: 返回确认环节重新处理
        end
    end
```

#### 5.9.4 一物一码编码规则

设备、高价值配件（屏幕/主板）和滤芯采用一物一码管理，一码终身不变。
普通配件（摄像头/喇叭等）不参与一物一码管理，按数量管理。

**编码格式：**

| 资产类型 | 编码格式 | 说明 |
|---------|---------|------|
| 柜机 | SN-G-{序号} | 系统统一分配，仓管在入库验收时扫码录入或系统生成 |
| 屏幕 | SN-P-{序号} | 同上 |
| 主板 | SN-Z-{序号} | 同上 |
| 滤芯 | SN-L-{序号} | 同上 |
| 普通配件 | 不适用 | 按数量管理，无编码 |

**编码分配规则：**

| 场景 | 分配方式 | 说明 |
|------|---------|------|
| 正常流程 | Drovio 分配 → 供应商打印粘贴 → 仓管扫码录入 | 供应商在工厂完成标签粘贴 |
| 极端场景（忘贴/贴错/重复码） | 仓管在小程序触发系统自动生成 SN 编码 → 打印标签 → 粘贴 → 扫码确认 | 与供应商码同一编码池，全局唯一 |

编码在入库验收时确定。建档时编码字段显示「待入库确认」，不预分配编码。

**编码约定：**
- 所有编码以 SN-{G/P/Z/L} 开头，由系统统一分配
- 编码全局唯一，系统不允许重复
- 编码一旦生成不可修改
- 仓管不可手动输入编码，只能通过扫码录入或系统生成

**重复码检测：**

| 扫码结果 | 系统行为 |
|---------|---------|
| 编码未绑定任何资产 | 正常入库 |
| 编码已绑定其他设备 | 标记异常，系统为当前设备生成新编码 |

供应商贴错码的旧标签由仓管现场决定覆盖或撕除。

**标签体系：**

| 资产类型 | 永久标识 | 二维码标签 |
|---------|---------|-----------|
| 设备（柜机） | 金属铭牌（激光刻印出厂编号） | SN-G 二维码 |
| 屏幕/主板 | 无 | SN-P/SN-Z 二维码标签（贴在配件本体上） |
| 滤芯 | 无 | SN-L 二维码标签 |
| 摄像头/喇叭等 | 无 | 无（按数量管理，不贴码） |

**标签异常处理：**

| 场景 | 处理方式 |
|------|---------|
| 标签脱落/损坏（更换已闭环） | 通过设备关联记录查找原编号，重新打印同一编号标签粘贴后扫码确认 |
| 标签脱落（更换未闭环） | 阻断验收，通知运维补录更换记录后继续 |
| 配件标签损坏 | 配件在设备内时通过设备关联追溯，不在设备内时通过系统记录追溯 |

标签脱落场景下拍照为必填项。

**扫码规则：**
- 全生命周期所有操作（入库/出库/回收/转移/报废）统一扫设备上实际贴的码
- 仓管使用仓库管理小程序扫码

---

#### 5.9.5 设备型号标准配置

在 web23 系统配置中按设备型号管理标准配置模板，定义每种型号应包含的高价值配件和滤芯明细。

**示例（S10 型号）：**

| 类型 | 配件/滤芯 | 数量 |
|------|----------|------|
| 高价值配件 | 屏幕 | 1 |
| 高价值配件 | 主板 | 1 |
| 滤芯（净水模块） | PP M5 | 1 |
| 滤芯（净水模块） | GAC 活性炭 | 1 |
| 滤芯（净水模块） | PP M1 | 1 |
| 滤芯（净水模块） | RO 反渗透 400G | 2 |
| 滤芯（矿化模块） | 矿化滤芯 | 2 |
| 滤芯（矿化模块） | 口感滤芯 | 1 |
| 滤芯（矿化模块） | PP 棉 | 1 |
| 滤芯（矿化模块） | 折叠滤芯 | 1 |
| **合计** | **高价值配件** | **2** |
| **合计** | **滤芯** | **10** |

**校验规则：**
- 入库时：仓管扫码绑定设备配件（屏幕/主板）后，系统自动校验配件数量与模板一致；滤芯独立入库，不参与设备绑定校验，不符则异常提醒。
- 出库前：系统自动校验设备已绑定的配件数量与模板一致，滤芯独立出库数量与模板一致（支持箱码批量/逐根扫码），不符则阻断出库。
- 模板由系统管理员维护，新增型号时配置。

---

#### 5.9.6 投放出库（仓库→现场）

| 步骤 | 操作人 | 动作 | 状态变更 |
|------|--------|------|---------|
| 1 | 系统管理员 | 创建出库单，填写投放位置，系统自动带出设备关联的高价值配件+普通配件+耗材（固定套件） | 无 |
| 2 | 仓库管理员 | 出库确认（扫码核验设备+配件，确认套件完整） | 库存中·可投放 → 运输中 |
| 3 | 运维 | 现场安装确认 | 运输中 → 使用中 |

- 校验规则：
  - 设备状态=库存中·可投放。
  - 关联高价值配件（屏幕/主板）状态=库存中·可投放。
  - 设备已绑定的高价值配件数量 = 型号标准配置模板（§5.9.5）。
  - 滤芯作为独立库存项出库，支持箱码批量扫描（二次确认可修改）或逐根扫码，出库数量 = 型号标准配置模板（§5.9.5）。滤芯不与设备预绑定，作为散件随设备发往现场，现场安装时由运维扫码绑定到设备（§5.9.11）。
  - 以上任一不满足则阻断出库。
- 出库单创建时不改资产状态，仓管出库确认时才触发状态变更。

---

#### 5.9.7 回收入库（现场→仓库）

| 步骤 | 操作人 | 动作 | 状态变更 |
|------|--------|------|---------|
| 1 | 系统管理员 | 创建回收单，填写回收原因 | 无 |
| 2 | 运维 | 现场拆卸取走设备 | 使用中 → 运输中 |
| 3 | 仓库管理员 | 入库验收，标记二级状态 | 运输中 → 库存中 |

- 校验规则：设备状态=使用中。
- 仓管标记二级状态：可投放（设备正常可继续使用）或故障（设备有问题，需维修或待报废）。
- 验收不通过：仓管标记异常+填写原因，系统自动通知系统管理员。
- 配件核验：仓管逐件扫描设备上的屏幕和主板码，与系统记录对比，不一致则标记差异并通知管理员。滤芯回收支持箱码批量扫描（二次确认可修改）或逐根扫码核验，滤芯可能随设备到货或单独到货（如运维单根更换后归还）。
- 摄像头核验：目视检查摄像头有/无状态，与系统记录对比。

---

#### 5.9.8 直接转移（现场→现场）

| 步骤 | 操作人 | 动作 | 状态变更 |
|------|--------|------|---------|
| 1 | 系统管理员 | 创建转移单，填写目标投放位置 | 无 |
| 2 | 运维 | 现场拆卸取走设备 | 使用中 → 运输中 |
| 3 | 运维 | 新位置安装确认 | 运输中 → 使用中 |

- 校验规则：设备状态=使用中。
- 不经过仓库，设备仓库归属不变。

---

#### 5.9.9 跨仓调拨（仓库→仓库）

| 步骤 | 操作人 | 动作 | 状态变更 |
|------|--------|------|---------|
| 1 | 系统管理员 | 创建调拨单，指定源仓库和目标仓库 | 无 |
| 2 | 源仓库管理员 | 出库确认 | 库存中 → 运输中 |
| 3 | 目标仓库管理员 | 入库验收，标记二级状态（可投放/故障），设备归属变更为目标仓库 | 运输中 → 库存中 |

- 校验规则：设备状态=库存中·可投放，设备当前归属=源仓库。
- 设备关联的高价值配件随设备一起调拨，关联关系不变，不解绑。滤芯作为独立库存项调拨，支持箱码批量扫描（二次确认可修改）或逐根扫码出库和入库，与设备分别管理。

---

#### 5.9.10 现场维修

设备在现场出现故障时，运维可尝试现场维修。

- 运维到场维修期间，设备运行状态进入「维护中」（不可售水），资产状态不变（仍为「使用中」）。
- **维修成功**：运行状态恢复「待机」（可售水），资产状态保持「使用中」不变。
- **维修失败**：运维走回收入库流程（§5.9.7），设备拉回仓库后由仓库管理员标记二级状态为「故障」。

维修操作的详细流程（工单派发、处理、完工等）见 §5.8 运维工单流程。

---

#### 5.9.11 配件现场更换

设备在现场需要更换配件或滤芯时，支持两种触发方式：工单触发和运维直接操作。

**更换流程（高价值配件：屏幕/主板）：**

| 步骤 | 操作人 | 动作 | 系统变更 |
|------|--------|------|---------|
| 1 | 运维 | 在小程序中选择设备，选择更换配件类型 | — |
| 2 | 运维 | 扫描旧件供应商码，解除与设备的关联 | 旧件解除绑定 |
| 3 | 运维 | 安装新件，扫描新件供应商码，绑定到设备 | 新件关联到设备 |
| 4 | 系统 | 更新设备-配件关联记录 | 记录更换时间、操作人、新旧件编号 |

**更换流程（滤芯）：** 同高价值配件流程，旧件扫码出、新件扫码入。支持运维一次性更换多根滤芯时批量扫码（先扫全部旧件，再扫全部新件，系统自动匹配替换）。

**更换流程（摄像头）：** 无码管理，在系统中标记摄像头为「无」→ 安装新件 → 标记为「有」。

**旧件返回仓库处理：**

| 旧件状况 | 仓管操作 | 系统状态变更 |
|---------|---------|-------------|
| 仍可正常使用（预防性更换） | 扫码确认接收，入库作为备件 | 变更为库存中·可投放 |
| 有故障但可维修 | 扫码确认接收，入库维修 | 变更为库存中·故障 |
| 确认无法修复 | 不入库，直接走报废流程 | 发起报废申请 |

---

#### 5.9.12 报废

报废操作不纳入流转单模型，独立管理。

**报废审批（适用于所有一物一码资产：设备/屏幕/主板/滤芯）：**
- 发起人：仓库管理员。
- 审批人：系统管理员。
- 提交前校验：设备/屏幕/主板要求资产状态=库存中·故障；滤芯独立报废允许库存中·可投放状态直接发起。均已填写报废原因。
- 驳回处理：退回发起人修改，可修改后重新提交。
- 审批通过：仓库管理员执行报废，状态变为「已报废」。
- 系统管理员自行发起报废：无需审批，直接执行。

**普通配件报废（摄像头/喇叭等）：** 无需审批，仓库管理员直接执行。

**设备报废时关联配件处理：**
- 设备有关联的屏幕和主板时：仓管先逐件扫码确认关联配件实物存在，系统展示每件配件编号，仓管逐件选择解除后的状态（可投放/故障），确认后系统解除关联，配件回到库存中待重新绑定或单独报废，设备状态变为「已报废」。滤芯不与设备绑定，无需解除关联，可独立发起报废。
- 设备无关联的屏幕和主板时：直接执行报废，跳过扫码步骤。
- 普通配件报废（摄像头/喇叭等）：无需审批，仓库管理员在库存查看中选择配件、确认数量、填写报废原因后直接执行，库存数量即时扣减。

---

#### 5.9.13 普通配件与耗材管理规则

普通配件和耗材按数量管理，不涉及状态流转。
- 入库：增加库存数量。
- 出库：减少库存数量。
- 使用：运维回填使用结果。
- 旧件回收：仓库管理员验收，入库或报废。

**摄像头管理：** 摄像头无二维码标签，按有/无状态管理。设备入库时标记「有」，拆卸时标记「无」，不追踪单件。

**普通配件报废：** 无需审批，仓库管理员直接执行。

P2 不实现批次管理。

---

#### 5.9.14 工单配件与耗材领用归还

运维基于工单发起配件或耗材领用，处理完成后归还或回收。

| 步骤 | 操作人 | 动作 |
|------|--------|------|
| 1 | 运维 | 基于工单发起配件或耗材领用申请 |
| 2 | 仓库管理员 | 出库确认 |
| 3 | 运维 | 回填结果 |
| 4 | 系统后端 | 校验领用数量 = 实际消耗 + 归还 |
| 5 | 运维 | 提交归还或旧件回收申请 |
| 6 | 仓库管理员 | 验收归还或旧件 |

- 步骤 2 说明：高价值配件和滤芯按唯一识别码扫码出库，普通配件/耗材按数量出库。
- 步骤 3 说明：高价值配件回填安装结果与旧件回收信息；普通配件/耗材回填领用数量、实际消耗数量与归还数量。
- 步骤 4 说明：校验不通过则阻断，返回步骤 3 重新处理。
- 步骤 6 说明：验收通过且可继续使用→回库或更新数量；不可继续使用→发起报废。验收不通过→返回步骤 5。
- 高价值配件（屏幕/主板）和滤芯不适用借还流程，仅按唯一识别码领用出库和旧件回收。
- 普通配件（摄像头/喇叭等）和耗材可按需借还。
- 归还或验收不通过时，返回对应处理环节重新处理，不得直接完结。
- 工单相关领用、归还和回收需与仓储流转保持一致。

详见流程图 C、角色时序图 C。

---

**流程图 C：工单配件与耗材领用、借还和回收**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["运维基于工单发起配件或耗材领用申请"] --> B["仓库管理员执行出库"]
    B --> C{"出库对象类型"}
    C -->|"高价值配件或滤芯"| D["按唯一识别码扫码出库"]
    C -->|"普通配件或耗材"| E["按数量出库"]
    D --> F["运维回填安装结果与旧件回收信息"]
    E --> G["运维回填领用数量、实际消耗数量与归还数量"]
    G --> H{"领用数量=实际消耗数量+归还数量"}
    H -->|"否"| I["返回数量回填环节重新处理"]
    H -->|"是"| J{"是否存在归还或旧件回收"}
    F --> J
    J -->|"否"| K["系统后端更新工单与台账"]
    J -->|"是"| L["仓库管理员完成验收"]
    L --> M{"验收是否通过"}
    M -->|"否"| N["返回归还或回收环节"]
    M -->|"是"| O{"是否可继续使用"}
    O -->|"是"| P["回库或更新数量台账"]
    O -->|"否"| Q["仓管发起报废申请"]
    Q --> Q1{"审批方式"}
    Q1 -->|"管理员审批"| Q2["仓管执行报废"]
    Q1 -->|"管理员直接发起"| Q2
    Q2 --> R["更新台账，状态=已报废"]
    P --> K
    R --> K
```

**角色时序图 C：工单配件与耗材领用、借还和回收**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor W as 仓库管理员
    actor M as 运维
    participant S as 系统后端

    M->>S: 基于工单发起配件或耗材领用申请
    S-->>W: 生成出库任务
    alt 高价值配件
        W->>S: 按唯一识别码完成出库
        M->>S: 回填安装结果与旧件回收信息
    else 普通配件或耗材
        W->>S: 按数量完成出库
        M->>S: 回填领用数量、实际消耗数量与归还数量
        S->>S: 校验领用数量=实际消耗数量+归还数量
    end

    opt 需要归还或旧件回收
        M->>S: 提交归还或回收申请
        S-->>W: 生成验收任务
        W->>S: 完成验收
        alt 验收通过且可继续使用
            S->>S: 更新回库结果、数量或唯一码去向
        else 验收通过但不可继续使用
            W->>S: 发起报废申请
            S->>S: 校验设备状态=库存中·故障
            A->>S: 审批报废申请（管理员直接发起时跳过此步）
            W->>S: 执行报废，状态=已报废
            S->>S: 更新报废结果与台账
        else 验收不通过
            S-->>M: 返回归还或回收环节重新处理
        end
    end

    S-->>M: 同步工单关联结果
```

**关键分支**

- 设备、高价值配件（屏幕/主板）和滤芯不支持借还；仅普通配件和耗材可基于工单借还。
- 回收、归还或验收不通过时，应返回对应处理环节，不得直接完结。
- 设备投放、回收和报废应形成完整的业务闭环，不允许状态悬空。
- 高价值配件（屏幕/主板）按单件唯一识别码管理（一物一码，SN-P/SN-Z 编码），与设备共用二维状态模型，支持独立出库。
- 滤芯按单件唯一识别码管理（一物一码，SN-L 编码），入库独立建档不与设备绑定，现场安装时由运维扫码绑定，报废需审批。
- 普通配件（摄像头/喇叭等）按数量管理，不参与一物一码。摄像头采用有/无状态管理（绑定到设备时标记「有」，拆卸时标记「无」）。
- 一物一码编码规则详见 §5.9.4。
- 设备入库后可随时关联或取消关联高价值配件，由仓库管理员操作。
- 设备出库/回收/转移时，关联的高价值配件状态自动联动。
- P2 不实现批次管理。
- 一物一码资产编码终身不变，标签损坏时重新打印同一编号。
- 供应商无码到货时系统生成 SN 编码入库，仓管打印标签粘贴后扫码确认。
- 设备报废时，系统自动解除关联的屏幕和主板，由仓管逐件选择状态（可投放/故障）；滤芯不与设备绑定，独立发起报废。
- 配件现场更换支持工单触发和直接操作两种方式。
- 设备型号标准配置模板由系统管理员在 web23 维护，入库和出库时自动校验。

**流程结果**

- 设备可按库存中·可投放、库存中·故障、运输中、使用中、已报废五种状态追溯流转。
- 高价值配件（屏幕/主板）和滤芯可按唯一识别码追溯当前状态和去向。
- 设备-配件（屏幕/主板）关联关系实时准确，所有变更记录可追溯；滤芯独立管理，绑定关系仅存在于现场安装后。
- 普通配件和耗材可按数量形成入库、出库、领用、借还、归还和回收记录。
- 设备与高价值配件状态、普通配件与耗材数量和仓储台账保持一致。
- 工单用料、归还和回收形成可追溯记录。
- 不可继续使用的相关对象进入报废闭环。

**验收标准**

- 设备状态流转符合二维状态模型定义，所有状态变更均有操作人和时间记录。
- 二级状态标记在入库验收时完成，不默认任何状态。
- 四种流转类型均遵循"创建流转单不改状态，物理确认才变更"原则。
- 报废操作有完整的审批记录（管理员直接发起除外）。
- 库存数量与实际在库资产一致。
- 一物一码资产（设备/屏幕/主板/滤芯）编号终身唯一，系统不允许重复或修改。
- 入库扫码绑定数量与型号标准配置模板一致。
- 出库前校验不通过时阻断出库。
- 配件更换后关联记录实时更新。
- 设备报废时关联屏幕和主板正确解除关联并回到库存；滤芯独立报废。
- 配件现场更换流程完整可追溯（新旧件编号、更换时间、操作人）。

**流程图 B：设备流转全生命周期**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;

    A["建档：设备/高价值配件进入库存中"] --> A1["入库验收：仓管标记二级状态（可投放/故障）"]
    A1 --> B{"业务类型"}

    B -->|"投放出库"| C1["校验：库存中·可投放 + 配件状态 + 配件数量=模板 + 滤芯出库数量=模板（箱码/逐根）"]
    C1 --> C2["仓管出库确认：库存中→运输中"]
    C2 --> C3["运维安装确认：运输中→使用中"]

    B -->|"回收入库"| D1["校验：使用中"]
    D1 --> D2["运维拆卸：使用中→运输中"]
    D2 --> D3["仓管验收入库：逐件扫描屏幕/主板码核验 → 滤芯箱码/逐根扫码核验 → 目视检查摄像头 → 标记二级状态"]
    D3 --> D4{"二级状态"}
    D4 -->|"可投放"| D5["状态=库存中·可投放"]
    D4 -->|"故障"| D6["状态=库存中·故障"]

    B -->|"直接转移"| E1["校验：使用中"]
    E1 --> E2["运维拆卸：使用中→运输中"]
    E2 --> E3["运维新位置安装：运输中→使用中"]

    B -->|"跨仓调拨"| F1["校验：库存中·可投放"]
    F1 --> F2["源仓管出库：库存中→运输中"]
    F2 --> F3["目标仓管入库验收，标记二级状态：运输中→库存中"]

    D6 --> G{"后续处理"}
    G -->|"仓库维修成功"| H["库存中·故障→库存中·可投放"]
    G -->|"报废"| I["仓管发起报废申请"]
    I --> J["管理员审批"]
    J --> K["仓管执行报废：→已报废"]

    K --> L["已报废（终态，P2 不可逆）"]
```

**角色时序图 B：设备流转全生命周期**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '22px'}, 'sequence': {'useMaxWidth': false, 'actorFontSize': 22, 'messageFontSize': 22, 'noteFontSize': 20}}}%%
sequenceDiagram
    autonumber
    actor A as 系统管理员
    actor W as 仓库管理员
    actor M as 运维
    participant S as 系统后端

    alt 投放出库
        A->>S: 创建出库单（填写投放位置）
        S->>S: 校验设备状态=库存中·可投放
        alt 校验通过
            S-->>W: 生成出库任务
            W->>S: 扫码出库确认
            S->>S: 库存中→运输中
            S-->>M: 同步安装任务
            M->>S: 提交现场安装确认
            S->>S: 运输中→使用中，记录台账
        else 校验不通过
            S-->>A: 阻断，提示设备不在库存中·可投放
        end
    else 回收入库
        A->>S: 创建回收单（填写回收原因）
        S->>S: 校验设备状态=使用中
        alt 校验通过
            S-->>M: 同步回收任务
            M->>S: 提交拆卸确认
            S->>S: 使用中→运输中
            S-->>W: 生成入库验收任务
            W->>S: 验收入库 + 标记二级状态
            S->>S: 运输中→库存中，记录台账
        else 校验不通过
            S-->>A: 阻断，提示设备不在使用中
        end
    else 直接转移
        A->>S: 创建转移单（填写目标位置）
        S->>S: 校验设备状态=使用中
        S-->>M: 同步转移任务
        M->>S: 拆卸确认
        S->>S: 使用中→运输中
        M->>S: 新位置安装确认
        S->>S: 运输中→使用中，记录台账
    else 跨仓调拨
        A->>S: 创建调拨单（指定源仓库和目标仓库）
        S->>S: 校验设备状态=库存中·可投放
        S-->>W: 源仓库出库任务
        W->>S: 出库确认
        S->>S: 库存中→运输中
        S-->>W: 目标仓库入库验收任务
        W->>S: 入库验收 + 标记二级状态
        S->>S: 运输中→库存中，归属变更为目标仓库
    end
```

### 5.10 公告与内容触达流程（P2 预留）

本节保留需求目标与流程定义，不纳入当前 P1 / MVP 核心流程与验收。

**流程目标**  
完成公告和平台内容从系统管理员创建、发布到终端展示和历史留存的闭环。

**触发条件**  
系统管理员创建公告或其他平台内容。

**参与角色与对象**  
系统管理员、系统后端、C 端用户、机主、柜机端。

**前置条件**

- 公告或内容已完成创建。
- 已明确目标终端与展示范围。

**主流程**

1. 系统管理员创建并发布公告或内容。
2. 系统后端按目标终端下发内容。
3. 终端接收并展示内容。
4. 用户或机主查看内容。
5. 内容下架后按规则停止展示或保留历史。

**关键分支**

- 柜机端展示、历史保留与多语言回退口径以 §4.7 内容触达与多语言规则为准。

**流程结果**

- 公告或内容完成发布与触达。
- 终端按规则展示或下架。
- 历史内容按规则留存。

**流程图**

```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'fontSize': '14px', 'lineColor': '#64748B'}}}%%
flowchart TD
    classDef default fill:#EAF4FF,stroke:#93C5FD,color:#1F2937,stroke-width:1px;
    A["系统管理员创建公告或内容"] --> B["发布或定时发布"]
    B --> C["系统后端下发到目标终端"]
    C --> D["终端接收并展示"]
    D --> E["用户或机主查看"]
    E --> F{"是否下架"}
    F -->|"是"| G["停止展示"]
    F -->|"否"| H["继续展示"]
    G --> I["按规则保留历史"]
```

## 6. 功能需求

### 6.1 柜机端

**模块目标**：承接用户在物理设备上的取水、支付、出水全流程，并支持扫码取水入口和套餐购买入口。

**适用角色**：C 端用户（通过柜机屏幕操作）。

| 场景 | 核心能力 | 边界 | 相关页面 |
|------|---------|------|---------|
| 取水与支付 | 待机页档位选择→水类型选择（纯水/矿化水）→金额展示（价格随水类型实时变化）、支付方式页、IC卡刷卡支付与异常重试、LINE Pay登录二维码与登录成功3分钟倒计时、Alipay/WeChat Pay扫码支付、IC卡补差二维码页(LINE Pay/Alipay/WeChat Pay)、支付成功页与放桶提示 | 离线时不可售水（与维护一致）；忙碌/维护/不可售水时开始按钮隐藏；水类型选择在档位选择之后；免费打水模式两种水均免费 | K01~K08, K12 |
| 出水控制 | 出水页（订单摘要/支付方式/已出水量/进度条）、暂停（3分钟倒计时/上限10次）、停止（二次确认）、取水结果页（完整/部分/失败）；绿色实体按钮（开始取水/继续出水）、红色实体按钮（暂停出水），停止出水仅柜机屏幕操作 | 支持两端触发/停止/实时同步；实体按钮由水机板执行并上报主控板同步屏幕 | K08, K09, K10 |
| 扫码取水入口 | 扫码取水按钮+弹窗展示动态取水二维码（5分钟刷新，正常可售水展示，异常隐藏） | 仅正常可售水状态展示 | K01 |
| 套餐购买入口 | 套餐购买二维码，引导进入LINE小程序 | 仅作为入口，不改变套餐价格 | K01 |
| 订单取消 | 取消页（支付超时/用户主动/设备离线/故障） | 离线取消含退款 | K11 |
| 状态同步 | C端操作时柜机屏幕同步显示流程状态，按钮保持可用 | 详见§5.1.6 跨端协同规则 | — |
| 设备异常 | 离线灰色横幅（不可取水）、维护/缺水橙色横幅、档位置灰 | 优先级：离线>维护>低水位 | K01 |

**范围边界**

- 不建设独立余额账户。
- 不支持复杂营销玩法。
- 不展示内部处理过程。
- 不承接优惠券、公告、广告、知识库与智能客服能力。
- 不承接代理经营、商城或财务相关能力。

### 6.2 C 端

**模块目标**：承接用户通过 LINE 扫码进入的取水、支付、出水全流程，以及套餐购买、订单管理和个人中心。

**适用角色**：C 端用户（通过 LINE 小程序操作）。

| 场景 | 核心能力 | 边界 | 相关页面 |
|------|---------|------|---------|
| 扫码取水 | LINE扫码进入选档位页（位置信息+档位含价格→水类型选择→价格实时更新+套餐剩余额度泰铢）、4步进度条 | 仅扫码进入，不提供附近设备发现；选择顺序：先选水量→再选水类型 | C06 |
| 支付 | 支付页（5场景：全额LINE Pay/套餐全额抵扣/套餐+LINE Pay补差/IC卡+LINE Pay补差/进行中订单阻断）、水类型+单价+金额展示、5分钟支付倒计时、返回确认弹窗 | C端扫码取水仅LINE Pay和套餐支付；IC卡补差场景为柜机端IC卡余额不足时C端LINE Pay代付 | C01 |
| 出水 | 出水页（步骤进度+进度条+实时水量+暂停+停止二次确认）、退出不影响柜机继续出水 | 同柜机端出水规则 | C07 |
| 结果 | 取水支付结果页（放桶5分钟倒计时+退款提示+水类型+价格）、取水结果页（完整/部分/失败，展示格式"10L · 矿化水"，30秒跳转详情） | 详细退款信息跳转订单详情 | C08, C09 |
| 取消 | 取水订单已取消页（支付超时/用户主动/设备异常，30秒跳转首页） | 订单未支付则无需退款 | C10 |
| 套餐购买 | 套餐购买页（品牌宣传+套餐选择+LINE Pay支付+退款规则说明+协议勾选） | 仅LINE Pay支付 | C05 |
| 订单与额度 | 订单列表（取水/套餐Tab，取水订单展示水类型）、取水订单详情（5场景，展示水类型+单价）、套餐订单详情（金额制：套餐金额+赠送金额+剩余额度泰铢，含退款申请4场景）、套餐详情（额度变动泰铢+使用须知弹窗） | 额度展示从升改为泰铢 | C02, C03, C04, C11 |
| 首页与个人 | 首页（5场景：进行中取水卡片+套餐卡片+取水入口）、我的（语言切换6种+联系客服+关于我们） | 进行中取水完成即消失 | C00, C12, C13 |

**范围边界**

- 不建设独立余额账户。
- 不支持复杂营销玩法。
- 不展示内部处理过程。
- 不承接优惠券、公告、广告、知识库与智能客服能力。
- 不承接代理经营、商城或财务相关能力。
- 扫码取水不支持微信支付和支付宝支付，仅支持 LINE Pay 和套餐支付。
- 扫码取水不支持 IC 卡支付，IC 卡用户需在柜机端操作。
- 取水完成不推送 LINE 消息通知，仅在小程序内展示结果。

### 6.3 跨端协同

柜机端与 C 端在取水流程中存在多处状态同步，以下列出关键协同场景，详细规则见 §4.2 和 §5.1.6。

| 协同场景 | 规则 |
|----------|------|
| 选档位+水类型同步 | C端停留在选档位页时柜机保持待机页；C端选择水类型后柜机同步展示对应水类型和价格；C端点击开始取水后柜机同步跳转支付方式页 |
| 支付先到先得 | 以发起支付请求为准，先到先得；一端发起后另一端等待；一端支付成功后另一端同步跳转取消页 |
| 放桶倒计时同步 | C端与柜机端共享同一5分钟倒计时，超时两端同步取消并退款 |
| 出水实时双向同步 | 暂停/继续/停止、已出水量、剩余未出水量两端一致；柜机实体按钮触发的暂停/继续操作同步至C端 |
| 设备异常取消同步 | 设备离线/维护/忙碌时两端同步取消订单，C端文案适配具体异常原因 |
| IC卡补差同步 | 柜机端IC卡余额不足时，C端支付页同步刷新到补差场景 |
| 代付 | A用户在柜机操作到支付环节生成支付码发给B用户，B用户通过C端LINE Pay完成支付；订单归属支付人，退款原路退回支付人 |
| 取水结果一致 | 出水完成后两端展示的取水结果（出水量、金额、状态）保持一致 |
| 多用户扫码互斥 | 同一时间多用户扫同一柜机取水码，仅第一个扫码登录成功的用户可取水，其他用户提示"设备忙" |

### 6.4 系统管理端

**模块目标**：提供系统管理员使用的后台载体，承接本期系统管理业务。

**适用角色**：系统管理员。

| 场景 | 核心能力 | 边界 |
|-----|---------|------|
| 设备管理 | 设备档案维护、网络状态查看（在线/离线）、设备运行状态查看（待机/忙碌/关机/维护）、设备售水状态管理（维护开关） | 设备离线时拒绝执行，提示设备离线；远程控制失败后手动重试，P1不做自动重试 |
| 设备远程控制 | 远程关机、开机、重启、放水（需指定水类型：纯水/矿化水）、开启/关闭维护模式、开启/关闭售水功能、开启/关闭制水功能、开启免费打水模式、控制记录查看 | 在线设备直接执行，离线设备拒绝执行并记录失败；放水额度最高 65L；维护模式开启后设备进入维护状态，不可售水 |
| 设备配置 | 取水档位配置、纯水单价配置、矿化水单价配置、设备参数配置（21项）、滤芯复位、恢复出厂设置、修改服务器地址/端口、修改设备号 | 取水档位范围1-65L；恢复出厂不清除网络配置与设备编号 |
| 固件升级 | MCU在线升级（下发URL）、MCU回滚升级（获取生产版本） | 支持失败自动回滚 |
| 内容管理 | 广告/公告下发 | 支持图文、视频 |
| 数据读取 | 读取水表累计流量与阀门状态、广播码读取水表唯一地址编码、IC卡余额同步管理 | 水表电表每5分钟采集一次 |
| 套餐配置 | 全平台通用购水套餐金额、赠送金额、上架销售时间配置 | 价格全平台通用；自动生成唯一 ID（PKG-001）；相同规格套餐不可重复上架；支持草稿/待上架/在售中/已下架/已结束五种状态管理；编辑保存与上架为独立操作 |
| 订单管理 | 全部柜机取水订单管理、套餐购买订单管理、取水订单人工售后发起与审批 | 不承接IC卡充值订单和远程放水记录；同一取水订单仅允许1笔售后单 |
| IC卡管理 | 发卡、直接充值、消费校验、补差处理、退款与冲正、停用/启用、台账查询、批量导入 | IC卡不绑定用户；停用卡不可消费和充值；机主侧管理为P2预留；业务规则见§4.4，流程见§5.4 |
| 告警管理 | 设备告警查看与处理 | 11种告警类型：外部水源无水、滤芯即将到期、滤芯已过期、设备离线、流量计故障、出水异常、净水TDS过高（仅纯水触发，矿化水仅监测不告警）、IC卡余额同步失败、水表读取失败、电表读取失败、长时间水位过低 |

**P2 预留**：设备异常报警与运维工单、仓储流转、公告与广告、知识库与智能客服、平台账号角色权限、平台日志、后台看板报表。

### 6.5 机主端（P2 预留）

本节保留需求目标与模块定义，不纳入当前 P1 / MVP 模块范围与验收。

**适用角色**：机主。

| 场景 | 核心能力 | 边界 |
|------|---------|------|
| 设备查看 | 本人设备列表、设备状态、基础经营信息 | 不管理非本人设备 |
| 报修与工单 | 发起报修、取消报修（运维尚未处理时）、查看报修记录、工单进度与详情 | 报修条件与取消规则见 §5.8 |
| 公告 | 查看平台公告 | 不参与公告管理 |
| IC卡 | IC卡列表、发卡、充值（LINE Pay）、台账查看 | 不提供系统管理员侧状态管理能力；仅管理本人发出的卡 |

### 6.6 运维端（P2 预留）

本节保留需求目标与模块定义，不纳入当前 P1 / MVP 模块范围与验收。

**适用角色**：运维。

| 场景 | 核心能力 | 边界 |
|------|---------|------|
| 工单管理 | 接收工单、开始处理、维修回填、完工关闭 | 不承担工单分配 |
| 设备操作 | 现场安装/拆卸/维修、设备状态查看 | 不承担远程控制和全局配置 |
| 配件耗材 | 领用申请、归还、旧件回收 | 仓储联动为P2预留 |

### 6.7 仓库管理员端（P2）

**适用角色**：仓库管理员。
**使用端**：仓库管理小程序（LINE Mini App，现场操作）+ Web 后台（库存查询、盘点差异审批，由系统管理员操作）。

仓库管理小程序是仓管的现场操作工具，支持入库验收、出库确认、报废处理、盘点执行、领用归还确认和库存查看。仓管可关联多个仓库，所有操作基于当前选中仓库，数据隔离。

小程序功能模块：首页（仓库概览 + 待办任务）/ 库存查看 / 扫一扫（扫码查资产 + 快捷操作入口）/ 操作记录。

#### 核心业务流程

| 场景 | 核心流程 | 边界与约束 |
|------|---------|-----------|
| 入库确认 | **设备首次入库：** 逐件扫码绑定（设备→屏幕→主板）→ 系统校验配件数量与型号标准配置一致 → 标记二级状态（可投放/故障）→ 拍照留证（§5.9.3）。滤芯入库规则见下方独立段。<br><br>**设备回收/调拨入库：** 逐件扫码核验设备及内置配件（屏幕/主板）与系统记录对比 → 标记二级状态 → 拍照留证（§5.9.7、§5.9.9）。<br><br>**滤芯入库（所有入库类型）：** 箱码批量扫描（扫箱码→系统展示明细→仓管二次确认并可修改）或逐根扫码，独立建档不绑定设备。<br><br>**通用：** 摄像头目视检查有/无状态。 | 无码资产系统生成 SN 编码打印标签后扫码确认；标签脱落且更换未闭环时阻断验收；扫码不一致标记异常汇总提交不阻断；批量回收一次只处理一台设备 |
| 出库确认 | **投放/调拨出库：** 逐件扫码（设备+屏幕+主板）→ 滤芯箱码批量扫码或逐根扫码 → 拍照留证（§5.9.6、§5.9.9）。 | 出库前校验：设备+屏幕+主板状态=库存中·可投放，不符则阻断；滤芯作为独立库存项出库，不与设备预绑定 |
| 报废 | **一物一码资产（设备/屏幕/主板）：** 提交前校验资产状态=库存中·故障 → 仓管发起（扫码→选原因→拍照）→ 管理员审批 → 仓管执行（逐件扫码确认关联屏幕/主板→逐件选择解除后状态：可投放/故障）→ 确认。设备无关联屏幕/主板时跳过扫码步骤。<br><br>**滤芯报废：** 允许库存中·可投放直接发起，管理员审批后执行，不涉及设备关联解除。<br><br>**普通配件（摄像头/喇叭等）：** 仓管直接执行（选配件→确认数量→填原因），无需审批，库存即时扣减。<br><br>**驳回：** 待办通知仓管，查看原因→修改→重新提交（§5.9.12）。管理员自行发起无需审批。 | 已报废为终态不可逆（P2）；审批规则详见 §5.9.12 |
| 盘点 | 管理员或仓管发起（选仓库+盘点范围）→ 有码资产逐件扫码，普通配件/耗材按清单录入实际数量 → 差异报告提交 → 管理员在 Web 端审批调账（§5.9）。 | 盘点范围：设备/配件/耗材；盘点差异需 Web 端审批后生效 |
| 领用归还 | **领用出库：** 运维发起申请 → 仓管确认（高价值配件逐件扫码，普通按数量）→ 拍照留证。<br><br>**归还验收：** 运维归还未使用配件，仓管验收（高价值扫码，普通按数量）。<br><br>**旧件回收：** 逐件扫码→选去向（可投放→入库 / 故障→标记 / 不可修复→发起报废）→ 拍照留证。系统自动校验领用数量 = 实际消耗 + 归还，不等则阻断完结（§5.9.14）。 | 领用出库由运维基于工单发起申请触发；高价值配件和滤芯不适用借还流程，仅按唯一识别码领用出库和旧件回收 |
| 维修确认 | 仓管在库存查看或扫一扫中找到「库存中·故障」设备 → 点击维修完成 → 状态变更为「库存中·可投放」（§5.9.10）。 | 仅限仓库内维修；现场维修归运维工单模块 |
| 配件管理 | 设备入库后可随时关联/取消关联屏幕和主板；设备报废后屏幕和主板自动解除关联回到库存，仓管可重新绑定到其他设备。 | 绑定/解绑通过扫目标设备码确认 |

#### 通用规则

| 类别 | 规则 |
|------|------|
| 通知机制 | LINE 推送 + 小程序待办列表双保险；触发事件：入库单/出库单/调拨单创建、领用申请、归还申请、报废审批结果、盘点任务创建；盘点差异审批完成仅 LINE 推送 |
| 拍照留证 | 除盘点外全部操作支持拍照，非必填；标签脱落场景拍照改为必填 |
| 扫码方式 | 一期：手机摄像头（LINE 小程序相机 API）；预留：外接蓝牙扫码枪 |
| 标签打印 | 无码资产系统生成 SN 编码，仓管手机直连蓝牙标签打印机打印二维码标签；标签脱落时打印同一编号标签 |

## 7. 产品可见状态与异常反馈

### 7.0 状态定义总览

以下汇总本文档中所有业务对象的状态枚举与定义。各子章节仅保留端侧特有的异常反馈和可见状态说明，不再重复列出状态枚举。

**取水订单**

| 维度 | 状态 | 说明 |
|------|------|------|
| 水类型 | 纯水 | 用户选择纯水取水，按纯水单价计价 |
| 水类型 | 矿化水 | 用户选择矿化水取水，按矿化水单价计价 |
| 主状态 | 待支付 | 用户已选择取水档位和水类型并进入支付方式页，或已进入对应支付路径但尚未完成支付 |
| 主状态 | 已支付取水中 | 用户已完成支付，设备正在执行取水或等待用户放入水桶；暂停出水期间仍为此状态 |
| 主状态 | 已完成 | 本次取水结果已正常确认；部分出水场景下出水类型标记为部分出水，系统按实际出水量处理退款 |
| 主状态 | 已取消 | 本次取水未继续执行，订单已取消 |
| 主状态 | 出水结果确认中 | 出水已完成但系统尚未收到最终消费数据（22 指令），系统按 §5.6.5 自动处理，20 分钟超时后自动结算 |
| 出水类型 | 完整出水 | 实际出水量等于用户选择水量 |
| 出水类型 | 部分出水 | 用户主动停止或暂停超时自动停止，实际出水量小于用户选择水量 |
| 售后结果 | 无 | 当前订单未进入退款、退额度或其他售后处理 |
| 售后结果 | 退款处理中 | 当前订单已进入退款、退额度或其他售后处理阶段，最终处理尚未完成 |
| 售后结果 | 退款/权益回退完成 | 当前订单涉及的实付退款、权益回退或两者组合处理已完成 |

**套餐购买订单**

| 状态 | 说明 |
|------|------|
| 待支付 | 用户已选择套餐并进入支付确认，但尚未完成支付 |
| 已完成 | 套餐购买支付成功，系统已生成对应取水额度（泰铢），总额度 = 套餐金额 + 赠送金额 |
| 已退款 | 套餐购买后发起退款，退款已完成 |
| 已关闭 | 套餐购买支付失败、取消或超时，本次购买未成功 |

**售后单**

| 状态 | 说明 | 适用范围 |
|------|------|---------|
| 待审核 | 取水售后单已创建，等待审批 | 仅取水售后 |
| 已驳回 | 取水售后单审批未通过，用户可重新发起 | 仅取水售后 |
| 退款中 | 退款处理中 | 取水售后审核通过后 / 套餐售后系统自动发起后 |
| 已完成 | 退款成功到账或额度已回退 | 通用 |
| 退款失败 | 第三方支付退款失败，需重试（取水售后由管理员重试，套餐售后 C 端和 Web 端均可重试） | 通用 |

**工单**

| 状态 | 说明 |
|------|------|
| 待派发 | 区域无对应运维时，工单等待管理员手动指派 |
| 已派单 | 系统已创建工单并自动派发给运维，等待运维接收 |
| 处理中 | 运维已接收工单并开始处理 |
| 已完成 | 工单处理完成 |
| 已关闭 | 工单已关闭，不再继续处理 |

设备运行状态、售水状态、远程控制状态、告警状态的详细定义见 §5.6。设备、高价值配件、普通配件与耗材资产状态为 P2 正式定义。P2 阶段「已报废」为终态，不支持还原。

### 7.1 用户取水状态与异常反馈

本节取水订单状态枚举与定义见 §7.0 状态定义总览。以下仅列出用户端与柜机端的异常反馈。

**异常反馈**

- IC 卡刷卡异常：卡不可用或未识别到卡片时，柜机展示刷卡异常页，提示异常原因，用户可选择重试刷卡或返回支付方式选择页。
- 登录超时：用户返回 LINE Pay 登录二维码页。
- 登录成功超时：柜机提示登录成功页倒计时 3 分钟超时后，返回 LINE Pay 登录二维码页，用户可重新扫码登录。
- 支付超时：用户返回支付方式页。
- IC 卡余额不足且支持补差：柜机展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付，用户可选择扫码方式继续支付。
- LINE Pay 路径权益不足：小程序展示应付金额，用户可继续补差支付。
- 补差取消或失败：用户返回支付方式页；如已形成冻结金额，系统同步释放。
- 支付成功：柜机展示支付成功页，展示订单摘要和支付方式，提示”支付成功，请放好水桶”，用户取水订单主状态进入已支付取水中。
- 放桶超时未取水：用户取水订单主状态展示为已取消；如退款或权益回退尚未完成，用户取水订单售后结果展示为退款处理中。
- 已支付取水中：柜机出水页展示订单摘要、支付方式、已出水量和出水进度条，提示”正在取水中，请稍后”。
- 暂停出水：柜机展示暂停状态和3分钟倒计时，订单状态仍为已支付取水中。
- 暂停次数达上限：暂停按钮不可用，出水继续进行。
- 用户主动停止：柜机停止出水，系统按实际出水量 × 水类型单价触发部分出水退款，订单状态更新为已完成，出水类型标记为部分出水，售后结果展示为退款处理中；处理完成后展示为退款/权益回退完成。
- 暂停超时自动停止：处理逻辑同用户主动停止。
- 少出水：系统按实际出水量 × 水类型单价计算退款金额（泰铢），售后处理进行中，用户取水订单售后结果展示为退款处理中；处理完成后，用户取水订单主状态保持已完成，售后结果展示为退款/权益回退完成。
- 退款或权益回退完成：用户取水订单主状态保持最终状态，售后结果更新为退款/权益回退完成。
- 结果未确认：用户取水订单主状态展示为出水结果确认中。
- 退款异常：用户侧仅展示最终处理结果，不展示内部失败原因和补救细节。
- C 端扫码时设备忙碌：C 端提示"设备忙，存在其他订单，请稍后再试"。
- C 端扫码时设备离线：C 端提示"设备当前不可用，请稍后再试"。
- C 端扫码时设备维护或不可售水：C 端提示"设备当前不可取水，请稍后再试"。
- C 端扫码时二维码已过期：C 端提示"二维码已过期，请重新扫描"。
- C 端扫码时用户未登录：C 端提示用户登录 LINE 后继续操作。
- C 端扫码时用户已有进行中取水订单：C 端提示"您有进行中的取水订单，请先完成"，并展示进行中订单信息。
- IC 卡用户 C 端扫码：C 端提示"IC 卡用户请在柜机端取水"。
- C 端选档位后超时未支付（5 分钟）：系统自动取消流程，设备释放，用户回到小程序首页。
- C 端取水流程中设备状态变化（离线/维护）：系统自动取消流程并提示用户。
- C 端出水过程中用户退出页面：柜机端继续出水不受影响，用户可通过首页"进行中取水"卡片返回。
- C 端暂停出水：展示暂停状态和 3 分钟倒计时，订单状态仍为已支付取水中；暂停后可继续出水或停止出水；暂停次数达上限后暂停按钮不可用。
- C 端取水结果页展示核心结果信息，详细退款信息跳转取水订单详情页查看。
- 套餐购买支付失败、取消或超时：套餐购买订单状态更新为已关闭，不生成取水额度。

### 7.2 工单、售后单与设备状态

工单与售后单状态枚举与定义见 §7.0 状态定义总览。设备运行状态、售水状态、远程控制状态、告警状态的详细定义见 §5.6。设备、高价值配件、普通配件与耗材资产状态为 P2 正式定义。P2 阶段「已报废」为终态，不支持还原。

**套餐退款业务规则**

用户在 C 端套餐订单详情页（C04）发起退款申请，系统自动按公式计算退款金额，无需人工审核。

- **退款公式**：退款金额 = 订单实付金额 − 已消耗实付金额（泰铢）。退款时该订单关联的赠送额度清零。详见 §4.3-27。
- **仅算购买额度**：退款仅计算购买额度的消耗，赠送额度不参与退款计算。多套餐按订单逐笔退款，已消耗购买额度按 FIFO（先进先出）顺序分配。
- **可退自动执行**：退款金额 > 0 时，系统自动执行原路退款（LINE Pay），套餐订单状态更新为"已退款"，售后单状态流转为"退款中"→"已完成"。
- **不可退拦截**：退款金额 ≤ 0 时（已消耗额度按原价计算的价值 ≥ 实付金额），系统在 C 端申请弹窗中展示完整计算明细和不可退原因，不允许提交退款申请。
- **赠送额度清零**：用户名下所有套餐订单均退款后，赠送额度自动清零，额度变动记录标记为"退款清零"类型。
- **额度用完屏蔽**：购买额度全部消耗后，C 端屏蔽"申请退款"按钮。
- **退款失败重试**：第三方支付退款失败时，C 端展示"退款失败"状态和"重新退款"按钮；Web 后台管理员也可手动重试退款。
- **C 端退款规则说明**：套餐购买页（C05）和套餐订单详情页（C04）底部展示退款规则说明，告知用户退款公式和限制条件。
- **使用须知**：套餐详情页（C11）提供"使用须知"弹窗，展示购买、使用和退款规则。
- **售后单管理**：取水售后和套餐售后统一在 Web 后台"售后管理"页面（W10）管理，通过订单类型筛选区分。套餐售后无需人工审核，Web 端仅查看记录，无审批操作；筛选"套餐订单"类型时，"待审核"和"已驳回"状态筛选自动隐藏。

**水表电表读数告警规则**

- 告警类型：水表读取失败、电表读取失败（共 11 种告警类型中的两种）。
- 触发条件：连续 3 次采集失败。
- 自动恢复：采集成功后系统自动关闭告警，失败计数归零。
- 人工处理：持续失败时管理员可在告警管理页面（W04）手动标记"已处理"。
- 重新告警：手动处理后若再次连续失败 3 次，系统重新生成告警。
- 基数管理、出厂原始值与使用量计算规则见 5.6 节。

### 7.3 IC 卡状态与异常反馈

**IC 卡可见状态**

- 可用
- 停用

**状态说明**

- 可用：IC 卡可正常充值和消费。
- 停用：IC 卡不可充值，不可消费。

**异常反馈**

- 余额不足且满足补差条件：柜机展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付。
- 余额不足且不满足补差条件：展示不可继续 IC 卡支付，并返回其他支付选择。
- 充值失败：展示充值失败结果，本次充值不生效。
- 停用卡使用：展示不可消费或不可充值结果。
- 补差取消或失败：如已形成冻结金额，系统同步释放，并返回支付方式选择或其他支付选择。
- 退款或冲正：展示对应处理结果。

### 7.4 内容触达状态与异常反馈

本节为 P2 预留定义，不纳入当前 P1 / MVP 范围与验收。

**可见状态**

- 待发布
- 已发布
- 已下架

**状态说明**

- 待发布：内容已创建但尚未生效。
- 已发布：内容已进入目标终端展示范围。
- 已下架：内容已停止展示。

**异常反馈**

- 内容未成功下发时，目标终端不展示该内容，不影响其他核心页面使用。
- 公告资源缺失或内容异常时，目标终端按能力降级展示，或不展示异常内容。
- 多语言资源缺失时，目标终端按默认语言回退，不展示未翻译内容。

## 8. 验收标准

### 8.1 MVP 成功标准

- P1 / MVP 核心业务流程可完整跑通。
- 用户与系统管理员可在各自职责范围内完成主要动作。
- 关键异常场景均有明确处理路径，不出现流程悬空。
- 上线后可支撑直营设备初期投入运行。
- 文档中定义的范围边界、角色边界和业务规则可被设计、研发和测试统一理解并执行。

### 8.2 取水支付

1. 用户选定档位和水类型（纯水/矿化水）后，系统按水类型单价和档位水量计算取水档位金额，并生成取水订单写入订单模块。
2. 选定取水档位后，柜机可展示支付方式页，支持 IC 卡、LINE Pay、Alipay 和 WeChat Pay 四种路径。
3. IC 卡刷卡异常（卡不可用或未识别）时，柜机展示刷卡异常页，支持重试刷卡或返回支付方式选择。
4. LINE Pay 路径需先扫码登录，登录成功后柜机展示登录成功页、订单摘要和 3 分钟倒计时；倒计时超时后返回登录二维码页。
5. 设备在线时 IC 卡余额不足，柜机展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付。
6. Alipay 和 WeChat Pay 路径柜机展示对应支付渠道的扫码支付二维码页；支付失败、取消或超时时返回支付方式页。
7. 支付成功后柜机展示支付成功页，展示订单摘要和支付方式，提示”支付成功，请放好水桶”。
8. 用户放入水桶并点击开始取水（柜机屏幕按钮或绿色实体按钮）后柜机展示出水页，展示订单摘要、支付方式、已出水量和进度条。
9. 放桶超时未取水时，系统按原扣减来源完成返还或退款。
10. 用户可在出水过程中暂停出水，暂停后展示 3 分钟倒计时，暂停次数上限为 10 次；暂停后可继续出水或停止出水。
11. 用户主动停止或暂停超时自动停止时，系统按实际出水量完成部分出水退款，订单状态更新为已完成，出水类型标记为部分出水。
13. 刷卡消费流程（20/22/23 指令）可正确执行：在线时查询卡状态后消费，离线时使用本地缓存消费，联网后自动上传离线消费记录。
14. 扫码远程消费流程（21/22 指令）可正确执行：5 种消费状态判定可正确处理，20 分钟超时后可正确处理退款。
15. 所有取水订单不区分支付路径或是否产生实付金额，均统一纳入订单模块。
16. 柜机待机页正常可售水状态展示扫码取水按钮，点击后弹窗展示动态取水二维码（每 5 分钟自动刷新）；设备忙碌、离线、维护或不可售水时按钮隐藏。
17. 用户通过 LINE 扫描取水二维码后，系统校验二维码有效性、设备状态、用户登录状态和进行中订单，校验通过后进入 C 端选档位页面。
18. C 端选档位页面展示柜机位置信息（文字地址 + 设备编号）、操作提示、取水档位按钮（含价格）→ 水类型选择（纯水/矿化水）→ 价格随水类型实时更新；套餐用户展示套餐剩余额度（泰铢）。
19. C 端扫码取水仅支持 LINE Pay 和套餐支付（套餐补差仅 LINE Pay），不支持微信支付和支付宝。
20. 套餐用户选档位后额度足够时展示抵扣确认页，额度不足时展示补差支付页。
21. 用户在 C 端选档位后 5 分钟内未完成支付，系统自动取消流程并跳转取水订单已取消页，展示取消原因和返回首页入口。
22. 用户在 C 端取水流程中设备状态变化（离线/维护），系统自动取消流程并提示用户。
23. 用户在 C 端取水流程中每步均可取消，取消后设备释放，回到小程序首页。
24. C 端出水页面展示步骤进度、进度条、实时水量、暂停按钮和停止按钮（二次确认），用户退出不影响取水。
25. 出水两端均可触发、均可暂停、均可停止、实时同步；暂停后展示 3 分钟倒计时，暂停次数上限为 10 次。
26. C 端操作期间柜机屏幕同步显示流程状态，柜机端按钮保持可用。
27. C 端取水结果页展示核心结果信息（出水量、金额、订单号、状态），详细信息跳转取水订单详情页。
28. C 端首页"进行中取水"卡片展示设备信息、状态和时间，取水完成后自动消失。
29. 同一用户同一时间只允许一个取水订单，已有进行中订单时扫码提示并展示进行中订单信息。
30. IC 卡用户无法在 C 端发起取水流程，可在 C 端进行补差操作。
31. 远程代付场景下订单归属支付人，退款原路退回支付人。
32. 柜机端设备离线时待机页展示灰色离线横幅（提示"设备离线，暂不支持取水"）、档位置灰不可选、开始取水按钮隐藏、不展示取水二维码。
36. 柜机端设备维护或不可售水（含缺水）时，待机页开始按钮由橙色横幅替代，档位置灰，不展示取水二维码。设备缺水（水位低且外部水源无水）时售水状态自动切换为不可售水。
37. 所有 C 端扫码取水订单与柜机端取水订单统一在订单模块管理，订单号格式一致（DR 前缀），不区分取水来源。
38. C 端支付页场景①~④展示 5 分钟支付倒计时，超时自动取消并跳转取水订单已取消页；用户点击返回时弹窗确认，确认后跳转取消页。
39. C 端支付成功后跳转取水支付结果页，展示放桶 5 分钟倒计时和退款提示；用户点击开始取水进入出水页。
40. C 端取水订单已取消页展示订单摘要（删除线）和取消原因，30 秒后自动返回首页。
41. 柜机待机页选择档位后展示水类型选择（纯水/矿化水），档位按钮下方价格随水类型实时更新。
42. 柜机和 C 端的所有订单摘要（支付方式页、刷卡页、LINE Pay页、支付成功页、出水页、结果页、取消页）统一展示水类型、水类型单价和应付金额。
43. 取水订单写入水类型字段，后台订单列表支持按水类型筛选。
44. 设备开启免费打水模式后，两种水类型均免费，无需支付直接进入出水环节。
45. 设备关闭售水功能后，两种水类型均不可售水。
46. 柜机支付成功页用户按绿色实体按钮可开始取水，功能等同柜机屏幕"开始取水"按钮；出水过程中按红色实体按钮暂停出水，暂停后按绿色实体按钮继续出水；柜机屏幕同步展示对应状态（出水中/暂停）；C端同步更新。
47. 柜机实体按钮由水机板直接执行，状态变更（开始取水/已暂停/已继续）上报主控板同步屏幕，再通过云端同步C端；设备离线/维护/关机状态下实体按钮无效。

### 8.3 套餐购买与抵扣

1. 用户可通过柜机套餐购买二维码入口或 LINE 小程序入口购买全平台通用购水套餐。
2. 系统仅展示处于上架销售期内的套餐。
3. 系统生成套餐购买订单并纳入订单模块，与取水订单分开处理。
4. 支付成功后生成对应取水额度；支付失败、取消或超时时关闭本次套餐购买订单。
5. 已获得取水额度不随后续套餐价格调整而变化，不设有效期。
6. 管理员修改已有套餐的价格或额度，不影响已购用户的存量额度。
7. 管理员可提前下架套餐，下架后套餐不可购买，已购用户额度不受影响。
8. 单笔订单最多使用 1 份套餐。
9. 套餐足额覆盖订单金额时，用户仍需在小程序点击支付完成结算确认。
10. 套餐不足时，用户可在小程序完成补差支付（仅支持 LINE Pay）。
11. 使用套餐额度取水时，系统按取水量 × 水类型单价计算消耗金额（泰铢），从套餐额度中扣减；部分出水时按实际出水量 × 水类型单价修正扣减，差额回退。
12. IC 卡路径和 Alipay/WeChat Pay 路径不校验套餐资产，不支持套餐抵扣。
13. 用户在 C 端套餐订单详情页（C04）点击"申请退款"时，弹窗展示退款计算明细（套餐金额、已消费金额、剩余实付金额、退款金额），并提示"退款后本次订单赠送的 XX 泰铢额度将清零"；可退时展示确认退款按钮，不可退时展示不可退原因和关闭按钮。
14. 退款金额 = 订单实付金额 − 已消耗实付金额（泰铢），退款金额 ≤ 0 时不可退；退款时该订单关联的赠送额度清零。
15. 多套餐订单按订单逐笔退款，已消耗购买额度按 FIFO 顺序分配；仅计算购买额度，赠送额度不参与退款计算。
16. 套餐退款由系统自动处理，无需人工审核；C 端申请后可退自动执行退款至 LINE Pay，退款中状态展示在 C04 和 W10。
17. 用户购买额度全部消耗后，C04"申请退款"按钮置灰不可点击。
18. 用户名下所有套餐订单退款完成后，赠送额度自动清零，C11 套餐详情页额度变动记录新增"退款清零"类型。
19. C05 套餐购买页和 C04 套餐订单详情页底部展示退款规则说明；C11 套餐详情页提供"使用须知"弹窗展示购买、使用和退款规则。
20. 套餐配置页面（W09）字段为套餐金额和赠送金额（泰铢），不再使用升数和每升单价。
21. 用户套餐剩余额度在 C 端（C00/C04/C11/C12）统一展示为泰铢。
22. 消耗顺序：取水消耗优先扣实付额度，实付用完后扣赠送额度；管理员扣除优先扣赠送额度。
23. 多套餐按 FIFO 顺序消耗实付额度。
20. ~~已废弃。~~ "设备取水单价"概念已拆分为"纯水单价"和"矿化水单价"，配置在 W23 系统配置页面。
21. W10 售后管理页套餐售后仅展示退款中/已完成/退款失败三种状态，无审批操作，详情弹窗展示完整退款计算公式。
22. W12 套餐订单退款确认弹窗展示新退款计算明细，不可退时展示原因。
23. 新建套餐时系统自动生成唯一套餐 ID（PKG-001 格式），套餐列表、套餐订单列表和用户套餐明细中均可按 ID 筛选查询。
24. 套餐支持草稿/待上架/在售中/已下架/已结束五种状态，编辑保存后进入草稿态，需手动点击"上架"进入销售流程。
25. 价格+取水额度+上架时间段完全相同的套餐不可同时处于"在售中"或"待上架"状态，保存时阻断并展示冲突套餐 ID 和名称。
26. 不同额度或不同时间段的套餐允许并存，上架时间可重叠。
27. 手动上架时系统自动判断：开始时间已到→进入"在售中"，未到→进入"待上架"；时间段已过期时提示先编辑新时间段。
28. 支付过程中套餐被管理员下架，不影响当前进行中的支付，用户可正常完成。
29. W12 套餐订单筛选支持按套餐 ID 和套餐名称文本搜索。

### 8.4 IC 卡管理

1. 发卡时系统记录 IC卡号，以 IC卡号 作为卡片唯一识别号建立业务关联。
2. 新发 IC 卡初始状态为可用，余额为 0，不强制首充。
3. 系统管理员可直接对指定 IC 卡充值，且必须填写充值原因。
4. IC 卡消费按水类型单价（纯水/矿化水）和档位水量计费。
5. IC 卡余额不足且满足补差条件时，柜机展示补差二维码页，支持 LINE Pay、Alipay 和 WeChat Pay 三种扫码支付；卡内余额可为 0。
6. IC 卡余额不足且不满足补差条件时，不得继续消费，返回支付方式选择。
7. IC 卡充值可生成独立充值订单，与取水订单分开处理。
8. 停用卡不可消费、不可充值；仅系统管理员可执行启用或停用，启用后恢复可用。
9. 退款或冲正时，仅退回本次订单对应的 IC 卡实扣金额。
10. IC 卡消费、退款、冲正、停用、启用及补差相关动作均可在台账中留痕。
11. 设备离线时不可售水，不进入 IC 卡支付流程。

### 8.5 设备控制与配置

1. 系统管理员可对在线设备发起关机、开机、重启、放水、维护模式、售水功能、制水功能、免费打水 8 种远程控制指令。
2. 远程放水额度最高 65L，超出时不允许提交。
3. 设备离线时拒绝执行，提示设备离线，设备上线后按优先级（设备控制 > 设备配置 > 固件升级/内容管理/数据读取）执行。
4. 忙碌状态下不可执行关机指令。
5. 所有控制指令记录指令内容与执行结果；远程放水生成独立记录写入设备管理与系统操作日志，不生成订单。
6. 远程控制失败时，系统展示失败结果，支持系统管理员手动重试。
7. 设备网络状态（在线/离线）和运行状态（待机/忙碌/关机/维护）可正确识别和流转；告警由独立维度管理，不影响运行状态。
8. 售水状态可按规则自动计算（网络在线 + 运行状态待机 + 可售水手动开关开启 + 无影响售水告警 + 水位不低于低液位浮球；低液位浮球触发时无条件不可售水，不依赖外部水源状态），系统管理员可通过维护开关手动覆盖。
9. 设备每 2 分钟上报网络心跳，超过 6 分钟未上报判定离线，离线后设备不可售水；每 10 分钟上报综合状态数据。
10. 设备通电或重启时，可主动上报 ICCID、IMEI、固件版本号、设备类型编码和程序版本。
11. 水表电表数据每 5 分钟采集一次。
12. 远程控制指令单条执行，后发命令排队。
13. 恢复出厂设置可清除业务配置并自动重启，网络配置与设备编号不变。
14. 远程放水指令需指定水类型（纯水/矿化水），控制记录展示水类型信息。
15. 07 命令 TDS 数据扩展为 6 字节（原水TDS + 纯水TDS + 矿化水TDS），纯水TDS>50ppm 触发告警，矿化水TDS 仅监测不告警。
16. 系统配置页面（W23）取水单价拆分为纯水单价和矿化水单价两个独立配置项。
17. 固件升级支持失败自动回滚。
18. 设备可配置参数（21 项）均支持远程下发，取水档位范围 1-65L；包含语音播报设置（Data[30]）和喇叭音量（Data[39]）。
19. IC 卡余额每 10 分钟全量推送到设备，同步失败时立即重试，连续 3 次失败触发告警；离线后上线立即同步。
20. 离线消费记录网络恢复后自动批量上报。
21. 11 种告警类型（外部水源无水、滤芯即将到期、滤芯已过期、设备离线、流量计故障、出水异常、净水 TDS 过高、IC 卡余额同步失败、水表读取失败、电表读取失败、长时间水位过低）可正确触发和恢复。
22. 出水异常告警可在出水完成后正确触发（订单预期量vs实际出水量偏差>10%，通过剩余水量Data[22-23]计算）。
23. 告警数据来源映射表（§5.6.9）中11种告警的检测信号、来源接口、检测周期与实际实现一致。

### 8.6 系统管理配置

1. 系统管理员可配置全平台通用购水套餐（金额制）、设备取水档位和纯水单价/矿化水单价。
2. 相同价格+取水额度+上架时间段的套餐不可重复上架；保存时阻断并提示冲突套餐信息。编辑保存后进入草稿态，需手动上架。
3. 设备未配置取水档位或未配置纯水单价或未配置矿化水单价时，不允许进入可售水状态，柜机不展示取水档位。
4. 柜机仅展示当前设备已启用取水档位。
5. 水类型单价（纯水/矿化水）用于单次取水、IC 卡消费和实付补差计算。
6. 系统管理端可执行全局异常处理、设备远程控制和 IC 卡高权限管理。

### 8.7 异常与售后

1. 终值缺失、少出水、退款异常均有明确处理路径，不出现流程悬空。
2. 少出水场景下，如同时存在套餐额度与实付金额，按”权益优先回退，实付后退”完成处理。
3. 使用套餐额度支付时，按实际出水量修正扣减并回退差额额度。
4. 系统管理员可对已完成或已取消的取水订单发起人工售后；同一取水订单在 P1 / MVP 阶段仅允许 1 笔售后单。
5. 人工售后审批通过后可执行部分退款、退额度或全额退款，并更新售后单状态和订单结果。
6. 部分退款金额大于 0 且不超过本次订单剩余可退实付金额；退额度不超过本次订单已扣减的套餐取水额度。
7. 异常订单可被系统管理员查询、排查和补救。

### 8.8 语音播报

1. 语音播报设置参数为 0x01 时，柜机在各交互节点可正确播放对应语音提示。
2. 语音播报设置参数为 0x02 时，柜机不播放任何语音提示（包括阻断提示），屏幕显示不受影响。
3. 语音播报设置参数为 0x03 时，柜机不播放任何语音，包括系统提示音和操作反馈音。
4. 播报语言跟随用户在待机页选择的语言，支持中文、英文、泰文、日文、韩文、俄文 6 种，选定后贯穿整个取水流程。
5. 语音播报文案与播报节点清单（20 个节点）中的定义一致。
6. 语言资源缺失时，默认按泰文回退播报。
7. 用户在语音播报未结束时进行下一步操作，当前语音立即被打断，开始播报下一条。
8. 设备处于维护中或不可售水状态时，用户尝试操作播放”设备维护中，请稍后再试”。
9. 设备处于缺水状态时，用户尝试操作播放”设备当前缺水，请稍后再试”。
10. 设备离线（超过 6 分钟无心跳）时，用户尝试操作播放”设备已离线，请稍后再试”。
11. 支付成功后超时未取水取消订单时，播放”您的订单已取消，退款将原路返回”。
12. 系统管理员可通过远程配置下发修改语音播报参数，参数修改后立即生效。
13. 设备离线时，语音播报配置下发被系统拒绝，生成失败记录。
14. 设备恢复出厂设置后，语音播报参数恢复为默认值。
15. 语音播报不阻塞用户操作，播报过程中用户可正常进行下一步操作。

---

优惠券、设备异常报警与运维工单、机主协同、公告与广告、知识库与智能客服、仓储流转、库存盘点、平台账号角色权限、平台日志、后台看板报表均为 P2 预留，不纳入当前 P1 / MVP 验收。

## 9. 风险与待确认项

### 9.1 风险

- 取水结果风险：设备结果回传不稳定，可能导致异常订单积压，影响用户结果确认时效。
- 设备远程控制风险：设备离线时拒绝执行，提示设备离线；指令执行失败时，系统管理员可手动重试。
- 第三方支付渠道风险：LINE Pay、Alipay、WeChat Pay 接口可用性、回调延迟或退款失败直接影响支付闭环和售后处理。
- 跨端数据一致性风险：C 端与柜机端实时同步（出水/暂停/停止/水量）对网络延迟和消息顺序存在依赖，极端场景下两端状态可能出现短暂不一致。
- IC 卡离线消费偏差风险：设备离线时基于本地缓存余额扣款，上线同步后可能发现实际余额不足以覆盖离线期间消费，形成超额消费异常订单。
- 多语言内容覆盖率风险：6 种语言的语音播报文案、UI 文案和退款说明等翻译完整性需持续保障，语言资源缺失时按泰文回退。
- 设备硬件可靠性风险：流量计、滤芯、冲洗阀等核心部件的故障率和维护成本可能影响设备可用性。

### 9.2 待确认项

- MCU 缓冲区大小（→ 5.6.4）：影响在线指令排队容量上限，缓冲区满后新指令丢失。
- 摄像头移动侦测功能（→ 5.6.7）：取决于摄像头选型，选型未确定。
- 摄像头查看位置（→ 5.6.7）：已在 Web 端设备详情页（W02）查看，待补充至 5.6.7。
- 喇叭硬件参数（→ 5.6.4）：型号、阻抗、功率待供应商确认后补充。

### 9.3 P2 运维能力待确认项

原待确认项"六类异常触发阈值与恢复条件"已在 5.8 运维工单流程中明确，相关内容已汇总至 9.2 待确认项。
