﻿# LMES 2.9.0 标准产品 PRD

> 本文只记录本版本相对既有标准产品的新增、修改或移除内容。未变化的标准功能不重复展开。

## 1. 版本总览

- 版本目标：提升下线扫码识别效率，补充返修 / 报废状态识别能力，支持长产线滚动切工单时按产品码恢复生产上下文，并沉淀标准装箱管理模块、设备状态分析和故障统计分析能力。
- 已纳入需求：R-290-001、R-290-003、R-290-004、R-290-005、R-290-006、R-290-007。
- 已关闭需求：R-290-002 已确认为 Bug 且已修复，不进入本版本 PRD。
- 原型参考：R-290-001 / R-290-003 参考 `prototype/process-traceability-serial-result-highlight.html`；R-290-004 参考 `prototype/packing-management.html`；R-290-005 参考 `prototype/equipment-status-analysis.html`；R-290-006 以本文流程图、字段表和规则说明为准；R-290-007 参考 `prototype/alarm-statistics.html`。
- 研发关注点：R-290-003 需确认一码回溯接口是否已可返回产品状态；R-290-004 需评审装箱记录数据模型、产品码 / 箱码并发校验、标签打印信号对接和追溯导出性能；R-290-005 需评审基座状态时长原始表字段、状态原因分析开关、班次日边界、发生次数切分和图表导出落地方式；R-290-006 需确认参与模式 4 的工位是否具备逐件识别产品码或由物料码 / 托盘码反查产品码的能力；R-290-007 需确认故障处理记录处理状态、故障原因、设备关联和导出服务的实际字段映射。

## 2. 需求导航

| 需求场景 | 覆盖需求 | 主要影响位置 | 章节 |
| --- | --- | --- | --- |
| 一码回溯下线防流出识别增强 | R-290-001、R-290-003 | 过程追溯 / 一码回溯；一码回溯查询接口 | [3.1 一码回溯下线防流出识别增强](#31-一码回溯下线防流出识别增强) |
| 柔性生产滚动切工单配方上下文适配 | R-290-006 | 系统配置 / 配方控制；工艺管理 / 工序配置（工序设置）/ 工序结果值配置；生产执行 / 普通工序进站；配方下发；追溯记录；工单统计 / 看板 | [3.2 柔性生产滚动切工单配方上下文适配](#32-柔性生产滚动切工单配方上下文适配) |
| 装箱管理标准模块 | R-290-004 | 装箱管理 / 装箱作业；装箱管理 / 装箱记录；装箱管理 / 装箱设置；条码管理；产品管理；过程追溯；标签管理；变量 / 信号配置 | [3.3 装箱管理标准模块](#33-装箱管理标准模块) |
| 设备状态分析 | R-290-005 | 监控与分析 / 设备状态分析；基座设备状态数据；图表导出；表格导出 | [3.4 设备状态分析](#34-设备状态分析) |
| 故障统计分析 | R-290-007 | 故障处理记录；设备故障次数排行；单设备故障原因分析；故障处理明细；当前列表导出 | [3.5 故障统计分析](#35-故障统计分析) |

## 3. 需求详情

### 3.1 一码回溯下线防流出识别增强

#### 3.1.1 原始需求

| 需求编号 | 原始需求内容 | 期望结果 |
| --- | --- | --- |
| R-290-001 | 下线工位一码回溯查询结果提示不醒目，需放大字体并增强颜色提示；原表归类为“展示优化，平铺展示优化为层级显示”。 | 下线员工扫码后一眼识别 `OK / NG / 漏工序`，降低 NG 件流出风险。 |
| R-290-003 | 返修完成后，一码追溯查询不到产品码返修标识；需新增返修标识，区分产品码为正常加工、返修加工还是已报废。 | 查询产品码时能识别该产品是正常加工件、返修加工件还是已报废产品。 |

#### 3.1.2 场景和目标

下线工位员工在产品下线时，通过一码回溯页面扫描产品二维码，依据查询结果判断产品是否允许流出。现有查询结果不够醒目，连续扫码时不便快速识别 `NG` 或 `漏工序`。

同时，返修完成件和已报废产品在一码回溯结果中缺少明确状态提示。用户已确认报废产品可以被一码回溯查询到，因此本版需要在查询结果区同步展示产品状态，帮助下线工位先识别产品风险，再查看明细。

#### 3.1.3 前端页面修改

| 模块 | 页面 / 入口 | 修改内容 | 交互 / 校验 |
| --- | --- | --- | --- |
| 过程追溯 | 一码回溯 | 查询后，在查询条件栏下方、产品概览和明细表格上方展示结果提示区；结果提示区同行展示 `查询结果`、`产品状态` 和工序统计。 | 查询后直接刷新结果提示区。 |

#### 3.1.4 展示规则

结果提示区作为扫码后的第一识别区域，展示以下信息：

| 信息 | 文案 / 取值 | 展示要求 |
| --- | --- | --- |
| 查询结果 | `OK / NG / 漏工序` | 沿用现有文案；结果值加粗、大字号展示。 |
| 产品状态 | `正常加工 / 返修加工 / 已报废` | 字段名称统一为 `产品状态`；结果值与 `查询结果` 使用同等级字号和视觉层级。 |
| 工序统计 | 合格工序数、不合格工序数、漏工序数 | 作为辅助信息展示，视觉层级低于 `查询结果` 和 `产品状态`。 |

展示颜色按最高风险信息统一处理，`查询结果` 和 `产品状态` 不分别独立上色。

| 命中场景 | 主强调色建议 | 说明 |
| --- | --- | --- |
| `OK` 且 `正常加工` | 绿色 | 正常可识别。 |
| `返修加工` 且未报废 | 蓝色 | 标识返修完成件，不按异常强提醒处理。 |
| `漏工序` | 橙色 / 黄色 | 提示存在漏工序风险。 |
| `NG` 或 `已报废` | 红色 | 高风险或禁止流出类提示。 |

同一产品同时命中多个提示条件时，展示优先级为：`已报废` > `NG` > `漏工序` > `返修加工` > `正常加工`。

#### 3.1.5 判定和数据规则

- `查询结果` 继续使用既有 `OK / NG / 漏工序` 判断结果，本版只调整展示位置和醒目程度。
- `产品状态` 用于补充说明产品加工 / 处置属性，不替代 `查询结果`。
- `产品状态` 判定口径如下：

| 产品状态 | 判定口径 |
| --- | --- |
| `正常加工` | 未查询到返修加工记录，且未查询到报废判定记录。 |
| `返修加工` | 产品存在返修判定或返修加工历史，且未命中报废判定。 |
| `已报废` | 产品存在报废判定记录，优先级高于 `返修加工` 和 `正常加工`。 |

- 产品状态优先复用追溯报表“返修判定”口径，以及返修管理中的产品判定记录 / 返修判定历史。
- `HasRepairMark` 偏生产流程运行时返修标记，返修完成后可能被清除，不作为一码回溯历史展示的唯一依据。
- 历史产品没有返修或报废判定记录时，按 `正常加工` 展示。

#### 3.1.6 数据与接口影响

- R-290-001 复用一码回溯既有查询结果和工序统计。
- R-290-003 需要一码回溯查询结果新增或透出 `产品状态` 字段，取值为 `正常加工 / 返修加工 / 已报废`。
- 如现有一码回溯接口未返回 `产品状态`，后端需按 3.1.5 的口径补充组装。

#### 3.1.7 验收口径

- 一码回溯查询后，结果提示区位于查询条件栏下方，并展示在产品概览和明细表格上方。
- 结果提示区展示 `查询结果：OK / NG / 漏工序` 中的一种，查询结果文案不变化。
- 结果提示区展示 `产品状态：正常加工 / 返修加工 / 已报废` 中的一种，字段名称为 `产品状态`。
- `查询结果` 和 `产品状态` 的结果值字号一致，且明显大于普通说明文字。
- `查询结果` 和 `产品状态` 的结果值使用同一主强调色。
- 产品存在报废判定记录时，产品状态展示为 `已报废`；产品存在返修记录且未报废时展示为 `返修加工`；无返修和报废记录时展示为 `正常加工`。

### 3.2 柔性生产滚动切工单配方上下文适配

#### 3.2.1 原始需求

| 需求编号 | 原始需求内容 | 期望结果 |
| --- | --- | --- |
| R-290-006 | 长产线投料完成后提前切工单：A 工单投料完成后，前段可切换 B 工单投新产品；A 工单已上线在制品继续按 A 工单信息加工。 | 缩短换单等待时间，同时避免旧产品加工、配方、追溯和统计串到新工单。 |

#### 3.2.2 场景和目标

长产线生产 A 工单时，如果必须等待 A 工单全部产品下线后才能切换到 B 工单，前段会长时间等待。现场期望 A 工单最后一个产品完成投料 / 首站上线后，前段即可切换 B 工单继续投新产品；已经上线的 A 工单在制品到达后续工位时，仍按 A 工单的产品、配方版本、工艺路线和统计口径继续加工。

本需求的目标是让普通工序进站在取得产品码后，按产品自身上下文恢复工单、产品、配方版本和工艺路线，而不是用当前工序段工单覆盖已上线产品的生产归属。

#### 3.2.3 前端页面修改

| 模块 | 页面 / 入口 | 修改内容 | 交互 / 校验 |
| --- | --- | --- | --- |
| 系统配置 | 配方控制 / 配方下发方式 | 在既有配方下发方式配置中新增选项 `按产品码上下文动态下发配方`。 | 仅工单管理模块启用时可选；工单管理模块关闭时置灰或保存拦截，并提示该模式依赖工单管理模块。 |
| 工艺管理 | 工序配置（工序设置）/ 工序结果值配置 | 新增进站结果值 `8 产品上下文异常`。 | 结果值编码、名称和说明需与普通工序进站流程、PLC / HMI 结果码说明保持一致。 |

#### 3.2.4 模式 4 配置规则

本版新增配方下发方式：`按产品码上下文动态下发配方`。

该模式用于长产线滚动切工单、在制品尾随、新旧工单同线并行的逐件配方切换场景。启用后，普通工序进站取得产品码时，系统按产品码恢复该产品已绑定的生产上下文，并以恢复后的上下文执行进站校验、产品信息 / 配方下发、出站落库和统计归属。

配置和使用规则：

- 模式 4 依赖工单管理模块；工单管理模块关闭时，不允许成功启用模式 4。
- 系统选择模式 4 后，参与该生产流程的工位按逐件产品码上下文执行，不再新增“工位当前模式”开关。
- 产品码获取方式沿用既有输入逻辑；产品码、物料码、托盘码均可作为输入，物料码 / 托盘码需先通过既有关联关系反查产品码。
- 参与模式 4 的工位必须具备逐件识别能力，或能够通过既有关联关系稳定取得产品码。
- 需要下发产品信息或配方的工位，必须按恢复后的产品上下文完成下发和设备确认后再允许加工。
- 当前工序段工单只用于新投产品的上下文初始化，不得覆盖已上线产品的历史工单归属。

#### 3.2.5 模式 4 进站流程

```mermaid
flowchart TD
    A[进站触发] --> B[获取输入码: 产品码/物料码/托盘码]
    B --> C{是否已取得产品码}
    C -->|否| C1[按既有关联反查产品码]
    C1 --> C2{反查成功?}
    C2 -->|否| X1[按既有产品码异常处理]
    C -->|是| D[判断配方下发方式]
    C2 -->|是| D
    D -->|模式4| E[按产品码查询生产历史上下文]
    D -->|其他模式| O[按既有进站逻辑处理]
    E --> F{是否存在历史上下文}
    F -->|是| G[恢复工单/产品/配方版本/工艺路线]
    F -->|否| H{当前是否首工序/投料工序}
    H -->|是| I[按当前投料工单初始化上下文]
    H -->|否| X2[返回8 产品上下文异常]
    G --> J[按产品上下文下发产品信息/配方]
    I --> J
    J --> K{设备确认/下发成功?}
    K -->|否| X3[按既有下发失败处理]
    K -->|是| L[按产品上下文执行进站校验]
    L --> M{校验通过?}
    M -->|否| X4[按既有进站异常返回]
    M -->|是| N[允许加工并按产品上下文落库]
```

#### 3.2.6 上下文恢复与初始化规则

| 场景 | 处理规则 |
| --- | --- |
| 产品已有生产历史上下文 | 优先恢复该产品的工单、产品 / 型号、配方 / 配方版本、工艺路线、上一工序等上下文；后续校验、下发和落库均使用该上下文。 |
| 产品无生产历史，且当前工位为首工序 / 投料工序 | 按当前投料工单 / 当前工序段工单初始化产品上下文，并绑定产品、配方版本和工艺路线。 |
| 产品无生产历史，且当前工位不是首工序 / 投料工序 | 阻断进站，返回 `8 产品上下文异常`。 |
| 产品已有历史工单，但当前工序段已切换到新工单 | 继续按产品历史工单处理，不用当前工序段工单覆盖产品归属。 |
| 产品历史上下文中的工艺路线不包含当前工位，或漏工序校验失败 | 按既有进站异常逻辑处理。 |

A 工单尾件到达后段工位时，即使前段当前工单已切换为 B，也必须继续按 A 工单上下文执行。B 工单新投产品在首工序初始化后，后续按 B 工单上下文流转。

#### 3.2.7 配方版本和数据落库规则

- 恢复历史配方时，优先读取追溯明细 / 流程追溯记录中的 `FormulaVersion`。
- `scms_productions` 汇总表当前仅记录 `FormulaId / FormulaCode` 时，不得作为恢复配方版本的唯一来源。
- 同一产品型号存在多个工单或多个配方版本时，必须以产品码已绑定的工单 / 配方版本判断，不允许只按产品型号取默认配方或最新配方。
- 出站保存、参数保存、追溯明细、物料使用记录、不合格记录等生产数据，均使用模式 4 恢复后的工单、产品、配方版本和工艺路线。

#### 3.2.8 新增进站结果

本版仅为模式 4 新增以下进站结果：

| 进站结果码 | 结果名称 | 使用范围 |
| --- | --- | --- |
| `8` | 产品上下文异常 | 产品码已取得，但系统无法按模式 4 恢复或初始化该产品生产上下文。 |

该结果值需在工序结果值配置中支持查看或维护，并可被普通工序进站流程引用。

返回 `8 产品上下文异常` 的场景：

| 场景 | 进站说明 |
| --- | --- |
| 首工序 / 投料工序新产品无历史，且无法确定当前投料工单 | 未找到当前生产工单，无法创建产品上下文。 |
| 非首工序产品无历史上下文 | 未找到产品生产上下文，不能在非首工序创建上下文。 |
| 历史上下文中的工单、产品、配方版本、工艺路线等关键字段无法恢复 | 产品历史上下文不完整，无法恢复生产上下文。 |

产品码异常、物料码 / 托盘码未绑定、产品状态异常、重码、漏工序、配方或产品信息下发失败、MES 系统异常等，沿用普通工序进站流程既有结果和处理逻辑。

工单管理模块关闭时不允许启用模式 4，该限制在系统配置处处理，不作为正常进站失败场景。

#### 3.2.9 统计与看板口径

- A 工单已上线在制品后续产生的进站、出站、参数、质量、物料和追溯记录继续归属 A 工单。
- B 工单新投产品从首工序初始化后归属 B 工单。
- 工单统计按产品已绑定工单归集，A 尾件继续计入 A 工单，B 新投产品计入 B 工单。
- 看板中的“当前工单”在模式 4 下不再默认代表整线唯一生产对象，应按工序段、工位或当前产品上下文解释。
- 按产品码查询追溯时展示产品真实绑定工单；按工单查询时仅返回绑定该工单的产品和记录。

#### 3.2.10 验收口径

- 系统配置中可看到第 4 种配方下发方式 `按产品码上下文动态下发配方`。
- 工单管理模块关闭时，模式 4 不允许配置成功，需在系统配置处置灰或保存拦截。
- 模式 4 下，进站输入产品码、物料码或托盘码时，系统均先取得或反查产品码，再进入产品上下文恢复流程。
- A 工单产品在首工序已绑定工单后，即使前段切换到 B 工单，后续工位仍按 A 工单上下文下发产品信息 / 配方并落库。
- B 工单新投产品在首工序按当前投料工单初始化上下文，后续按 B 工单统计。
- 非首工序扫描到无生产历史产品时，系统阻断进站，进站结果返回 `8 产品上下文异常`，不将该产品挂到当前新工单。
- 历史配方版本无法恢复时，系统阻断进站，进站结果返回 `8 产品上下文异常`，不默认取最新版本。
- 需要下发配方或产品信息的工位，设备未确认成功前不允许进入加工。
- 追溯明细、参数保存、工单统计和看板统计均按产品自身绑定工单归属，不被当前工序段工单覆盖。

### 3.3 装箱管理标准模块

#### 3.3.1 原始需求

| 需求编号 | 原始需求内容 | 期望结果 |
| --- | --- | --- |
| R-290-004 | 组件回收：装箱管理。 | 回收已项目化验证的装箱能力，沉淀为 LMES 标准产品模块，支持扫码装箱、记录查询、解绑、导出和可选完箱标签打印。 |

#### 3.3.2 场景和目标

包装 / 下线工位需要将产品码与箱码形成稳定绑定关系，支持现场按箱码或按产品批量扫码，控制产品是否合格、是否重复装箱、是否超出箱容量，并在装箱完成后形成可查询、可解绑、可导出的装箱记录。当前装箱能力来自项目组件，尚未形成标准产品模块和统一规则口径。

本版新增 `装箱管理` 标准模块，目标如下：

- 提供 `装箱作业`、`装箱记录`、`装箱设置` 三个页面。
- 支持 `箱码优先`、`产品优先` 两种作业顺序。
- 支持按 `产品信息`、`箱体信息` 配置保存值，并按配置驱动作业录入、记录展示和导出。
- 支持通用装箱规则，或按产品型号维护不同装箱数量、合格校验和启用保存值。
- 支持产品码重复校验、装箱容量校验、一码追溯合格校验、旧箱补装、产品型号切换保护、正式记录解绑和历史保留。
- 支持装箱明细查询 / 导出，导出时可追加指定工序的追溯数据。
- 支持完箱后触发标签打印信号并展示打印结果，但标签模板、打印机、补打和打印记录仍归属标签管理。

一期默认单一装箱点，不新增多装箱点配置；不把工单作为独立装箱维度。若现场需要保存工单号，可按 `产品信息` 保存值配置。正式装箱记录只支持解绑留痕，不提供物理删除入口。

#### 3.3.3 模块入口和页面范围

| 页面 | 入口 | 主要使用角色 | 页面职责 |
| --- | --- | --- | --- |
| 装箱作业 | LMES 主系统 -> 装箱管理 -> 装箱作业 | 包装 / 下线工位操作员 | 扫描或录入箱体信息、产品信息，执行字段校验、合格校验、容量校验、强制装箱、完箱和可选打印。 |
| 装箱记录 | LMES 主系统 -> 装箱管理 -> 装箱记录 | 生产管理、质量、仓储、包装人员 | 查询装箱明细和箱汇总，查看箱详情，解绑正式装箱明细，导出装箱明细和追溯数据。 |
| 装箱设置 | LMES 主系统 -> 装箱管理 -> 装箱设置 | 管理员、工艺 / 实施人员 | 维护装箱模式、保存值、装箱规则、记录字段、导出追溯数据和完箱打印信号。 |

#### 3.3.4 装箱设置页

装箱设置页用于维护装箱作业页和装箱记录页的生效配置。页面按业务视图组织为 `装箱设置`、`保存值配置`、`规则设置`、`记录与导出` 四个区域；完箱标签打印相关字段写入 `装箱设置` 区域。顶部提供吸顶保存操作区，包含 `保存设置`、`放弃修改` 和保存状态；页面滚动时该操作区保持可见。任意配置变更后进入 `有未保存修改` 状态；系统内离开设置页前需提示用户继续编辑或放弃修改。设置保存成功后成为最新装箱设置；新打开的装箱作业页、当前箱完成后的下一箱、清空当前作业后重新开始的作业使用最新设置；已经开始且已有未完箱数据的当前箱继续按开始时的设置完成。

| 页面区域 | 主要内容 | 数据来源 | 对其他页面的影响 |
| --- | --- | --- | --- |
| 装箱设置 | 装箱模式、箱内型号、满箱确认、箱码再装、规则适用、产品型号来源、完箱标签打印。 | 系统枚举、变量 / 信号配置、产品管理、标准标签打印流程。 | 决定作业页字段顺序、是否展示产品型号、是否允许补装和混箱，以及完箱后是否触发标签打印。 |
| 保存值配置 | 产品信息字段、箱体信息字段、获取方式、变量、条码校验规则、字段顺序。 | 条码管理、变量 / 信号配置。 | 决定作业页录入字段、记录字段和导出字段。 |
| 规则设置 | 通用规则或按型号规则、适用产品型号、装箱数、合格校验工序、启用保存值。 | 产品管理、工序管理、保存值配置。 | 决定每次作业匹配的装箱数量、质量校验和字段范围。 |
| 记录与导出 | 装箱明细字段、字段显示顺序、导出追溯数据。 | 装箱记录、工序管理、过程追溯。 | 决定记录页展示列、导出列和追溯追加字段。 |

装箱设置区域字段：

| 配置项 | 是否必填 | 默认值 | 取值 / 来源 | 保存限制 | 作业影响 |
| --- | --- | --- | --- | --- | --- |
| 装箱模式 | 是 | `箱码优先` | `箱码优先 / 产品优先` | 必须有值。 | 决定箱体信息和产品信息的录入先后顺序。 |
| 箱内型号 | 是 | `仅同型号` | `仅同型号 / 不限型号` | 必须有值；选择 `不限型号` 时，规则适用只能为 `通用规则`，且不允许开启完箱标签打印。 | 决定同一箱内是否允许多个产品型号。 |
| 满箱确认 | 是 | `自动完成` | `自动完成 / 人工确认` | 必须有值。 | 达到装箱数后自动完箱，或由操作员点击 `装箱`。 |
| 箱码再装 | 是 | `禁止再装` | `禁止再装 / 未满补装` | 必须有值。已满箱始终不可再装。 | 决定已完箱或强制装箱后仍未满的箱码是否允许补装。 |
| 规则适用 | 是 | `通用规则` | `通用规则 / 按型号` | `箱内型号=不限型号` 时只能保存为 `通用规则`。 | 决定是否维护多套按产品型号区分的装箱规则。 |
| 产品型号来源 | 条件必填 | `手动选择` | `手动选择 / 变量获取` | 仅 `规则适用=按型号` 时必填。 | 决定作业页产品型号由人工选择，还是读取产品识别码变量后匹配产品管理。 |
| 产品识别码变量 | 条件必填 | 空 | 【变量】选择器 | 仅 `产品型号来源=变量获取` 时必填。 | 读取产品管理中的产品识别码，用于匹配当前作业产品型号。 |
| 完箱标签打印 | 否 | 关闭 | 开关 | `箱内型号=不限型号` 时不允许开启。 | 开启后完箱成功时触发标准标签打印流程。 |
| 打印触发信号 | 条件必填 | 空 | 【变量】选择器 | 仅完箱标签打印开启时必填。 | 完箱成功后由装箱管理主动写入触发值。 |
| 打印产品识别码 | 条件必填 | 空 | 【变量】选择器 | 仅完箱标签打印开启时必填。 | 装箱管理将按当前产品型号查询到的产品识别码写入该变量，用于标准标签打印流程匹配标签模板和产品型号。 |
| 打印结果 | 条件必填 | 空 | 【变量】选择器 | 仅完箱标签打印开启时必填。 | 装箱管理读取打印结果并展示成功或失败说明。 |

保存值配置区域字段：

| 配置项 | 是否必填 | 默认值 | 取值 / 来源 | 保存限制 | 作业和记录影响 |
| --- | --- | --- | --- | --- | --- |
| 产品码 | 是 | 空 | 固定字段 | 不允许删除；固定扫码 / 录入；不支持变量获取。 | 每件产品必填；参与重复、合格、型号、容量校验；随每条装箱明细保存。 |
| 箱码 | 是 | 空 | 固定字段 | 不允许删除；固定扫码 / 录入；不支持变量获取。 | 每箱必填；参与箱码状态、补装和容量校验；随箱记录和明细保存。 |
| 保存值名称 | 是 | `自定义保存值` | 人工录入 | 不能为空；全局不允许重复；不得与固定字段重名。 | 作为作业页字段名、记录列名和导出列名。 |
| 所属对象 | 是 | 新增时由入口决定 | `产品信息 / 箱体信息` | 保存后不支持直接切换对象；如需调整所属对象，应删除后重建。 | 决定字段随产品明细保存，还是随箱记录保存。 |
| 获取方式 | 是 | `每次录入` | `每次录入 / 重复使用 / 变量获取` | 必须有值。 | 决定字段是否进入扫码跳转、是否沿用上次值、是否读取变量。 |
| 变量 | 条件必填 | 空 | 【变量】选择器 | 仅 `获取方式=变量获取` 时必填。 | 提交所属对象时读取变量当前值并保存。 |
| 校验规则 | 否 | 不选择 | 【条码规则】选择器 | 可为空；再次选择已选规则可清空；选择后规则必须仍为可用状态。 | 对每次录入、重复使用和变量获取字段均可做格式校验。 |
| 顺序 | 是 | 新增时追加到末尾 | 拖拽排序 | 保存时按当前顺序落库。 | 决定所属对象内展示顺序、作业页每次录入字段跳转顺序，并作为记录字段和导出字段默认顺序基础。 |

保存值获取方式规则：

| 获取方式 | 作业页行为 | 是否参与自动跳转 | 提交时校验 | 值保存规则 |
| --- | --- | --- | --- | --- |
| 每次录入 | 每件产品或每个箱体均需重新录入。 | 是 | 必填；如配置条码规则，需通过格式校验。 | 提交所属对象时保存本次录入值。 |
| 重复使用 | 初始带出上次值，作业时可修改。 | 否 | 必填；如配置条码规则，需通过格式校验。 | 修改后后续产品或箱体继续沿用新值。 |
| 变量获取 | 作业页只展示读取值或保存快照，不进入扫码跳转。 | 否 | 提交所属对象时读取变量；读取失败、为空或不符合条码规则时阻断提交。 | 同一对象一次提交内使用同一次读取快照。 |

变量获取空值判定：

- 变量不存在、变量不可读、读取超时、读取异常或接口未返回值，均按读取失败处理。
- 变量返回 `null / undefined`，或返回字符串经去除首尾空格后为空，按空值处理并阻断所属对象提交。
- 数值 `0`、布尔值 `false` 不按空值处理；若字段配置了条码校验规则，仍需按转换后的字段值执行格式校验。

保存值保存规则：

- 产品信息保存值随每件产品装箱明细保存。
- 箱体信息保存值是箱级属性，每个箱码保存一份，随箱记录保存。
- 箱体信息保存值必须同时随该箱下每条产品装箱明细冗余保存，便于装箱明细查询、导出和追溯时按产品行查看箱级信息。
- 箱详情固定展示该箱完整的箱体信息快照；箱汇总用于按箱追踪状态和箱内产品关系，不默认按自定义箱体信息追加展示列，也不通过隐藏的箱体信息做关键词检索。
- 自定义保存值可删除，删除前需二次确认；删除不物理删除历史装箱明细中的已保存快照。
- 产品码、箱码可配置条码管理中的校验规则；未配置时不做格式校验，但仍执行必填、重复、容量、箱码状态等业务校验。
- 不按产品型号区分时，通用规则直接使用保存值配置中的全部字段。
- 按产品型号区分时，每条装箱规则可选择启用哪些保存值，默认全选；字段顺序仍沿用全局保存值顺序。

规则设置区域字段：

| 配置项 | 是否必填 | 默认值 | 取值 / 来源 | 保存限制 | 作业影响 |
| --- | --- | --- | --- | --- | --- |
| 适用产品型号 | 条件必填 | 空 | 【产品型号】选择器 | `规则适用=按型号` 时必填；同一产品型号不能存在于多条启用规则。 | 作业页按当前产品型号匹配唯一装箱规则。 |
| 装箱数 | 是 | 空 | 正整数 | 必须为大于 0 的整数，不提供系统默认值。 | 决定当前箱目标数量、满箱判断和超装校验。 |
| 合格校验 | 是 | 开启 | 开关 | 关闭时不需要选择校验工序；开启时必须选择至少一个校验工序。 | 开启后产品码需完成指定工序且结果合格才允许装箱。 |
| 校验工序 | 条件必填 | 空 | 【工序】选择器 | 合格校验开启时必填。 | 同时判断 `NG` 和 `漏工序`，不拆成两个独立开关。 |
| 启用保存值 | 是 | 全选 | 保存值配置 | 至少保留产品码、箱码；自定义保存值可按规则选择。 | 决定作业页显示 / 录入字段和记录保存字段。 |

规则设置规则：

- 装箱规则不要求用户填写规则名称；后台可使用规则 ID 作为唯一标识。
- `规则适用=通用规则` 时，仅维护一套通用装箱数、合格校验和保存值；规则区不展示保存值选择栏。
- `规则适用=按型号` 时，可以维护多条规则；每条规则可选择一个或多个产品型号，但同一产品型号只能命中一条启用规则。
- `产品型号来源=手动选择` 时，作业页通过产品型号选择弹窗选择型号，弹窗仅展示已配置在启用规则中的产品，列表字段为 `产品名称`、`产品型号`。
- `产品型号来源=变量获取` 时，系统读取产品识别码变量并匹配产品管理中的产品型号；作业页只读展示产品型号，不允许人工切换。
- `箱内型号=不限型号` 时，仅支持通用规则，不支持按每个型号分别配置规则，也不支持完箱标签打印。

记录与导出区域字段：

| 配置项 | 是否必填 | 默认值 | 取值 / 来源 | 保存限制 | 影响范围 |
| --- | --- | --- | --- | --- | --- |
| 装箱明细字段 | 是 | 固定字段默认展示 | 固定字段、保存值配置 | 箱码、产品码、产品型号、明细状态、装箱时间为固定字段，不允许取消展示；字段顺序可拖拽。 | 决定装箱明细列表和基础导出字段。 |
| 导出追溯数据 | 否 | 空 | 工序管理、过程追溯 | 同一工序只允许配置一次；至少选择一个参数；可拖拽排序。 | 导出装箱明细时按产品码追加追溯字段。 |

导出追溯数据配置字段：

| 配置字段 | 是否必填 | 默认值 | 取值 / 来源 | 保存限制 | 导出影响 |
| --- | --- | --- | --- | --- | --- |
| 工序 | 是 | 空 | 【工序】选择器 | 必须选择；同一工序只允许配置一次。 | 决定按产品码追加哪一道工序的追溯数据。 |
| 参数类型 | 是 | 默认展示采集参数页签 | `采集参数 / 物料参数 / 配方参数` | 仅用于筛选可选参数。 | 不单独形成导出字段。 |
| 参数 | 是 | 空 | 所选工序下的参数 | 至少选择一个参数。 | 每个参数追加为导出列。 |
| 顺序 | 是 | 新增时追加到末尾 | 拖拽排序 | 保存时按当前排序落库。 | 决定追溯字段追加顺序。 |

设置页动作和保存限制：

| 动作 | 触发方式 | 系统校验 | 成功后 | 失败后 |
| --- | --- | --- | --- | --- |
| 保存设置 | 点击吸顶操作区的 `保存设置`。 | 校验本页所有必填项、条件必填项、唯一性、数据来源有效性和联动限制。 | 本次配置成为最新装箱设置；新打开的装箱作业页、当前箱完成后的下一箱、清空当前作业后重新加载的作业页使用最新设置；已有正式装箱记录保留生成时的设置和保存值快照；提示保存成功。 | 阻断保存，页面定位到第一个错误区域，在对应字段或区域展示错误原因；如错误区域不在当前视口，需滚动到该区域。 |
| 放弃修改 | 点击吸顶操作区的 `放弃修改`。 | 如存在未保存修改，弹窗二次确认。 | 恢复到上一次已保存配置，并提示已放弃修改。 | 用户取消时停留当前编辑状态。 |
| 离开设置页 | 切换系统菜单或切换到装箱管理其他页签。 | 如存在未保存修改，弹窗提示。 | 弹窗选择 `放弃修改` 后恢复上一次已保存配置并离开。 | 选择 `继续编辑` 时关闭弹窗并停留设置页；不提供 `保存并离开`。 |
| 刷新或关闭浏览器 | 刷新页面、关闭页签或关闭浏览器。 | 如存在未保存修改，按浏览器能力触发离开提示。 | 操作员确认离开后，本次未保存配置不保证保留。 | 操作员取消时继续停留设置页。 |

未保存设置弹窗规则：

- 弹窗标题为 `未保存修改`，正文需说明当前装箱设置存在未保存修改，放弃后将恢复为上一次已保存配置。
- 弹窗按钮仅保留 `继续编辑` 和 `放弃修改`；`继续编辑` 为主按钮，点击后关闭弹窗并保留当前编辑内容；`放弃修改` 点击后恢复上一次已保存配置并继续执行离开动作。
- 该弹窗不提供 `保存并离开`，避免保存校验失败后用户已经离开设置页导致状态不清。

保存设置时必须满足以下限制：

- 固定字段产品码、箱码不可删除，不可改为变量获取。
- 保存值名称全局不允许重复，也不得与产品码、箱码等固定字段重名。
- 获取方式为变量获取时，必须选择变量；配置了条码校验规则时，提交作业时变量值也必须通过格式校验。
- 按型号规则下，同一产品型号只能存在于一条启用规则中；未配置装箱规则的产品型号不会出现在作业页产品型号选择弹窗中。
- 装箱数必须为大于 0 的整数；装箱数为空或小于等于 0 时不允许保存。
- 合格校验开启时，必须选择至少一个校验工序；校验工序来自工序管理。
- `箱内型号=不限型号` 时，只能保存为通用规则，且必须关闭完箱标签打印。
- 完箱标签打印开启时，必须配置打印触发信号、打印产品识别码和打印结果，并确保可复用标准标签打印流程。
- 导出追溯数据中，同一工序只允许配置一次；编辑时如更换工序，需二次确认并清空原已选参数。
- 设置保存不按全系统、全浏览器或当前浏览器是否存在未提交装箱作业做硬阻断；已开始且已有未完箱数据的当前箱继续按开始时的设置完成，新打开的作业页、当前箱完成后的下一箱、清空当前作业后重新开始的作业使用最新设置。
- 已生成的正式装箱记录保留生成时的设置和保存值快照，后续设置变更不反写历史记录。
- 任一浏览器保存设置后，其他已打开的装箱作业页需在页面重新获得焦点、扫码字段提交、产品信息提交、箱体信息提交、完箱提交前或系统定时检查时，检查装箱设置是否已更新。
- 作业页检测到装箱设置已更新，且当前页存在未完箱数据时，不自动切换设置，不弹窗打断扫码；在作业页顶部常驻提示“装箱设置已更新，当前箱仍按原设置执行，完成当前箱或清空当前作业后使用最新设置”，并继续按当前箱开始时的设置完成当前箱。
- 作业页检测到装箱设置已更新，且当前页不存在未完箱数据时，自动加载最新设置并提示“装箱设置已更新，已切换到最新设置”。

#### 3.3.5 装箱作业页

装箱作业页面向包装 / 下线工位操作员，按已保存配置动态生成产品型号区、箱体信息区、产品信息区、实时装箱列表和操作按钮。作业页不展示内部规则名称。

| 页面区域 | 显示条件 | 主要内容 | 操作规则 |
| --- | --- | --- | --- |
| 产品型号区 | `规则适用=按型号` 时展示。 | 当前产品型号、选择入口或变量匹配结果。 | 手动来源可打开选择弹窗；变量来源只读展示。 |
| 箱体信息区 | 始终存在，字段按配置显示。 | 箱码、箱体信息保存值、修改箱信息入口。 | 箱码优先时先录入；产品优先时达到目标数量或强制装箱时录入。 |
| 产品信息区 | 始终存在，字段按配置显示。 | 产品码、产品信息保存值。 | 每件产品循环录入；达到目标装箱数后不得继续提交。 |
| 实时装箱列表 | 当前页已有未完箱产品时展示。 | 序号、产品码、产品型号、产品信息保存值、箱体信息保存值、装箱时间、删除操作。 | 完箱前可删除暂存产品；正式完箱后列表清空。 |
| 配置更新提示 | 当前页使用的设置不是最新装箱设置时展示。 | 无未完箱数据时提示已切换最新设置；有未完箱数据时提示当前箱仍按原设置执行。 | 不阻断当前箱扫码和提交；完成当前箱或清空当前作业后切换到最新设置。 |
| 操作区 | 按当前模式、数量、权限和当前状态展示。 | `装箱`、`强制装箱`、`清空当前作业` 等按钮。 | 动作可执行时才展示对应按钮；满箱人工确认时展示 `装箱`，当前数量大于 0 且小于目标数量时展示 `强制装箱`，存在未完箱数据或配置更新提示时展示 `清空当前作业`。 |

作业主流程：

```mermaid
flowchart TD
    A[进入装箱作业] --> B{是否按产品型号区分}
    B -->|否| C[使用通用规则]
    B -->|是, 手动选择| D[弹窗选择产品型号并匹配规则]
    B -->|是, 变量获取| E[读取产品识别码变量并匹配产品型号]
    D --> F{当前页是否已有未完箱数据}
    F -->|是且产品型号变化| F1[二次确认并清空当前页本次作业数据]
    F -->|否| G[生成作业字段]
    F1 --> G
    C --> G
    E --> G
    G --> H{装箱模式}
    H -->|箱码优先| I[先完成箱体信息]
    I --> J[循环录入产品信息]
    H -->|产品优先| K[循环录入产品信息]
    K --> L[达到目标数量或强制装箱时补齐箱体信息]
    J --> M{达到目标数量?}
    L --> M
    M -->|未满| N[继续扫码或强制装箱]
    M -->|已满且自动完成| O[生成正式装箱记录并清空作业区]
    M -->|已满且人工确认| P[操作员点击装箱]
    N --> Q[二次确认或补齐箱体信息后强制装箱]
    P --> O
    Q --> O
    O --> R{是否开启完箱标签打印}
    R -->|是| S[触发打印并读取打印结果]
    R -->|否| T[结束]
    S --> T
```

装箱模式差异：

| 装箱模式 | 正常路径 | 字段顺序 | 允许动作 | 限制 |
| --- | --- | --- | --- | --- |
| 箱码优先 | 先完成箱体信息并建立当前箱，再逐件扫描产品。 | 箱体信息 -> 产品信息循环。 | 修改箱信息、删除实时暂存产品、装箱、强制装箱。 | 箱体信息未完成前不允许录入产品信息；强制装箱不补填箱体信息，但需二次确认。 |
| 产品优先 | 先逐件扫描产品形成实时暂存，达到目标数量后录入箱体信息并提交。 | 产品信息循环 -> 箱体信息。 | 删除实时暂存产品、达到目标后录入箱体信息、未满时强制装箱。 | 产品数量未达到目标前，不允许直接录入箱体信息；未满强制装箱时需先弹窗补齐箱体信息。 |

产品型号区规则：

- 仅 `规则适用=按型号` 时展示产品型号区。
- `产品型号来源=手动选择` 时，点击 `选择产品型号` 打开弹窗；弹窗仅展示已配置在启用装箱规则中的产品，列表字段为 `产品名称`、`产品型号`，支持按产品名称或产品型号关键词查询和分页。
- 选择产品型号后，系统匹配唯一装箱规则；未匹配到规则时阻断作业。
- `产品型号来源=变量获取` 时，系统读取产品识别码变量，并通过产品管理匹配产品型号；未读取到产品识别码或无法匹配产品型号时，阻断开始本次装箱作业。
- `产品型号来源=变量获取` 时，系统在进入作业页、完箱后开始下一箱、作业页重新读取变量或变量刷新时，按当前产品识别码变量值重新匹配产品型号。
- 变量重新匹配到的产品型号与当前产品型号一致时，不清空当前作业数据；匹配不到产品型号时阻断继续录入，并提示产品型号无法确定。
- 变量重新匹配到的产品型号与当前产品型号不一致，且当前页没有未完箱数据时，直接切换为新产品型号并重新生成作业字段。
- 手动选择产品型号、变量值变化或配置刷新导致当前产品型号变化时，只要当前页已有未完箱数据，均需二次确认；不论新旧产品型号是否命中同一条装箱规则，确认后均清空当前箱码、实时装箱列表、每次录入值、变量读取状态、字段校验状态和页面错误提示；取消则保持原产品型号和原作业数据。
- 变量获取到的新产品型号与当前产品型号不一致且当前页已有未完箱数据时，操作员可选择立即刷新并按上一条规则清空当前页本次作业数据，也可暂不切换并继续完成当前箱；暂不切换只对当前未完箱作业有效，当前箱正常装箱、强制装箱或清空当前作业后，系统重新读取变量，若变量仍指向新型号，则切换为新产品型号并重新生成作业字段。
- 检测到装箱设置已更新且当前页已有未完箱数据时，操作员可继续按当前箱开始时的设置完成当前箱，也可点击 `清空当前作业` 后加载最新设置；该提示需支持其他浏览器保存设置后被当前作业页感知。

当前产品型号确定规则：

- `规则适用=按型号` 且 `产品型号来源=手动选择` 时，当前产品型号取操作员在产品型号选择弹窗中选择的产品型号。
- `规则适用=按型号` 且 `产品型号来源=变量获取` 时，当前产品型号取产品识别码变量读取值在产品管理中匹配到的产品型号。
- `规则适用=通用规则` 且 `箱内型号=仅同型号` 时，第一个扫入产品码按追溯报表最新完工记录取得的产品型号作为当前箱型号，后续产品码取得的产品型号必须与当前箱型号一致；完箱打印如需确定当前产品型号，也使用该当前箱型号。
- `箱内型号=不限型号` 时不执行产品型号一致性拦截，也不支持完箱标签打印，因此不需要确定打印用当前产品型号。

作业页暂存与离开规则：

- 当前实时装箱列表、当前箱、已录入保存值、字段校验状态、当前型号和当前箱开始时的装箱设置，均属于作业页未完箱暂存数据；未提交 `装箱` / `强制装箱` / 补装前，不生成正式箱记录和装箱明细。
- 操作员切换菜单、进入系统内其他页面或再返回装箱作业页时，系统自动保留并恢复该页未完箱暂存数据，不弹窗要求操作员保存。
- 作业页暂存数据只对当前浏览器当前作业页有效，不参与其他终端的历史有效数量、装箱记录查询和导出；后续正式提交时，服务端仍需按最新正式记录和当前提交内容做并发复验。
- 暂存期间如装箱设置被其他浏览器更新，当前未完箱作业仍按开始时的设置继续完成；当前箱完成或清空当前作业后，再加载最新装箱设置。
- 浏览器刷新、关闭页签、关闭浏览器或重新打开系统时，如当前页存在未完箱暂存数据，系统按浏览器能力触发离开提示；操作员确认刷新或关闭后，未完箱暂存数据不保证恢复，重新进入作业页按最新装箱设置开始。
- 放弃的作业页暂存数据不记录装箱业务日志，不影响正式装箱记录和历史有效数量。

字段录入规则：

| 字段类型 | 触发方式 | 校验内容 | 通过后 | 失败后 |
| --- | --- | --- | --- | --- |
| 每次录入字段 | 输入框回车。 | 是否为空、是否符合条码规则。 | 字段显示绿色 `√`，焦点跳到下一个每次录入字段；若本对象字段已完成，则提交所属对象。 | 字段显示红色 `×` 和错误提示，焦点停留当前字段，不提交对象。 |
| 重复使用字段 | 修改后回车或所属对象提交。 | 是否为空、是否符合条码规则。 | 更新沿用值，后续记录继续沿用新值。 | 字段显示红色 `×`，不更新沿用值。 |
| 变量获取字段 | 所属对象提交时系统读取。 | 变量是否可读取、读取值是否为空、是否符合条码规则。 | 将读取值作为所属对象本次提交快照。 | 阻断所属对象提交；字段显示变量未读取到值或格式不正确。 |
| 产品码 | 输入框回车。 | 必填、条码规则、重复装箱、追溯报表最新完工记录取得的产品型号是否满足当前型号规则、合格校验、容量。 | 校验通过后进入产品信息提交或装入实时列表；产品信息提交时服务端复验。 | 重复、格式错误、型号不符合当前规则或容量已满直接阻断；合格校验失败弹出一码追溯查询。 |
| 箱码 | 输入框回车或箱体信息提交。 | 必填、条码规则、箱码状态、容量、补装策略、箱内型号集合。 | 建立或切换当前箱。 | 箱码已满、禁止再装、容量超限或型号不一致时阻断。 |

页面动作规则：

| 动作 | 展示 / 触发条件 | 点击后校验 | 通过后 | 失败后 / 弹窗 |
| --- | --- | --- | --- | --- |
| 选择产品型号 | 按型号且手动选择时展示。 | 校验是否匹配唯一启用规则；如已有未完箱数据，校验是否切换当前产品型号。 | 切换当前作业型号并生成字段。 | 当前页已有未完箱数据且型号变化时弹出二次确认；取消则不切换。 |
| 修改箱信息 | 仅箱码优先且当前箱已成立、尚未正式完箱且不是旧箱补装时展示。 | 校验箱码和启用的箱体保存值；如修改箱码，新箱码不得已存在有效箱。 | 更新当前箱体信息快照，并同步当前实时列表。 | 弹窗内展示错误并阻断保存。 |
| 删除实时暂存产品 | 实时装箱列表中展示。 | 产品尚未正式完箱。 | 二次确认后从实时列表移除。 | 已正式完箱的明细不能通过作业页删除。 |
| 清空当前作业 | 当前页存在未完箱数据或装箱设置已更新提示时展示。 | 二次确认；确认文案需面向现场操作员，说明会清空当前页面已扫码但还没有完成装箱 / 强制装箱的内容。 | 清空当前箱、实时暂存产品、每次录入值、变量读取状态、字段校验状态和错误提示；如存在最新装箱设置，重新加载最新设置。 | 用户取消时保留当前作业数据和当前箱开始时的设置。 |
| 装箱 | 满箱且 `满箱确认=人工确认` 时展示。 | 当前箱存在；数量达到目标装箱数；产品、箱体、容量、型号和并发校验通过。 | 生成正式箱记录和装箱明细；清空作业区。 | 阻断完箱并提示原因。 |
| 强制装箱 | 当前数量大于 0 且小于目标装箱数时展示。 | 当前数量不超过目标装箱数；产品、箱体、容量、型号和并发校验通过。 | 生成未满箱记录，完箱方式为 `强制装箱`。 | 校验失败时阻断并提示原因。 |

作业页弹窗规则：

| 弹窗 | 触发条件 | 展示内容 | 按钮 | 确认后 |
| --- | --- | --- | --- | --- |
| 产品型号选择 | 点击 `选择产品型号`。 | 产品名称、产品型号；支持关键词查询和分页。 | `确定 / 取消`。 | 选择产品型号并匹配规则。 |
| 产品型号变化确认 | 手动切换产品型号、变量获取型号变化或配置刷新导致当前产品型号变化，且当前页已有未完箱数据。 | 手动切换或配置刷新时，提示会清空当前页面已扫码但还没有完成装箱 / 强制装箱的内容；变量获取型号变化时，同时提示可立即刷新或完成当前箱后刷新。 | `确定 / 取消`；变量获取场景可理解为 `立即刷新 / 暂不切换`。 | 确认后清空当前页本次作业数据；变量获取场景暂不切换时，当前箱完成或清空后重新读取变量。 |
| 一码追溯查询 | 产品码合格校验失败。 | 产品码、`OK / NG / 漏工序` 结果、统计、本规则已配置校验工序的工序明细；默认展示全部已配置校验工序，支持切换为只查看异常数据。 | `查看异常数据 / 确定`；切换后按钮文案为 `查看全部数据`。 | 仅查看异常或关闭弹窗，产品信息提交保持阻断，已录入产品码和错误状态保留。 |
| 修改箱信息 | 点击 `修改箱信息`。 | 箱码和启用的箱体信息保存值。 | `确定 / 取消`。 | 校验通过后更新当前箱体信息。 |
| 补齐箱体信息 | 产品优先未满强制装箱且尚未绑定箱码。 | 箱码和启用的箱体信息保存值。 | `确定 / 取消`。 | 校验通过后执行强制装箱。 |
| 强制装箱确认 | 点击 `强制装箱`。 | 当前数量、目标数量和强制装箱提示。 | `确定 / 取消`。 | 确认后按强制装箱提交。 |
| 删除暂存确认 | 点击实时列表删除。 | 被删除产品码和提示。 | `确定 / 取消`。 | 确认后移除实时暂存产品。 |
| 清空当前作业确认 | 点击 `清空当前作业`。 | 当前箱码、实时暂存产品数量和清空提示；提示会清空当前页面已扫码但还没有完成装箱 / 强制装箱的内容。 | `确定 / 取消`。 | 确认后清空当前页未提交作业数据；不记录装箱业务日志。 |

作业页提示方式规则：

- 使用弹窗的场景：需要用户做选择或确认风险的操作，包括产品型号变化并清空当前作业、清空当前作业、删除实时暂存产品、强制装箱确认、产品优先强制装箱时补齐箱体信息、修改箱信息、合格校验失败查看一码追溯详情。
- 使用 toast 的场景：操作结果或阻断原因不需要用户二次决策时，包括字段必填 / 格式错误、重复产品码、型号不一致、容量已满、箱码禁止再装、保存 / 放弃 / 装箱 / 强制装箱 / 补装 / 删除暂存 / 导出 / 解绑成功、服务端复验失败、打印成功或失败。
- 使用页面内常驻提示的场景：状态会持续影响当前作业且不应打断扫码时，包括装箱设置已更新但当前箱继续按原设置执行。
- 使用浏览器离开提示的场景：刷新、关闭页签或关闭浏览器时存在未完箱暂存数据；确认离开后未完箱暂存数据不保证恢复。
- 系统内切换菜单或进入其他页面再返回装箱作业页时，自动保留并恢复未完箱暂存数据，不弹窗要求操作员确认。

#### 3.3.6 装箱作业业务校验

装箱作业采用“字段回车即时校验 + 所属对象提交时集体验证 + 完箱事务内复验”的规则。前端即时校验用于减少现场误扫，服务端事务复验用于保证并发下数据正确。

对象提交校验：

| 提交对象 | 触发时机 | 校验内容 | 通过后 | 失败后 |
| --- | --- | --- | --- | --- |
| 产品信息 | 产品信息最后一个每次录入字段回车；或系统准备将产品加入实时列表时。 | 产品码必填；启用产品保存值必填；条码规则；变量获取值；产品码不重复；产品码型号满足当前型号规则；合格校验；容量；箱内型号集合。 | 将产品加入当前实时装箱列表；保存产品信息快照；清空每次录入字段并聚焦下一件产品。 | 阻断加入实时列表；保留已录入值和错误状态。 |
| 箱体信息 | 箱体信息最后一个每次录入字段回车；或产品优先强制装箱弹窗确认时。 | 箱码必填；启用箱体保存值必填；条码规则；变量获取值；箱码状态；容量；补装策略；箱内型号集合。 | 建立当前箱；保存箱体信息快照；绑定产品优先模式下的实时暂存产品。 | 阻断建立 / 切换箱码；保留当前录入值和错误状态。 |
| 完箱 | 达到目标数量自动完成、人工点击 `装箱`、或点击 `强制装箱` 并确认。 | 当前箱存在；正式提交数量不超过目标数量；正常装箱数量达到目标数量；强制装箱数量允许小于目标数量；并发复验通过。 | 生成正式箱记录和装箱明细；清空当前实时列表、每次录入值、变量读取状态和校验状态；自动聚焦下一次录入；如存在最新装箱设置，下一箱加载最新设置。 | 阻断完箱，并提示原因。 |

容量校验规则：

- 当前箱容量按 `历史有效数量 + 当前实时暂存数量` 判断；历史有效数量只统计未解绑的正式装箱明细，当前实时暂存数量只统计当前页尚未正式完箱的产品。
- 产品信息提交前必须校验 `历史有效数量 + 当前实时暂存数量 + 1 <= 目标装箱数`，不满足时阻断产品码或产品信息继续提交。
- 箱码优先模式下，当前箱达到目标装箱数后，产品码和产品信息录入区不得继续提交；`满箱确认=自动完成` 时立即提交完箱，`满箱确认=人工确认` 时仅允许点击 `装箱`、删除实时暂存产品或修改箱信息。
- 产品优先模式下，实时暂存数量达到目标装箱数后，不允许继续提交产品信息；操作员需录入箱体信息完成正常装箱，或删除暂存产品后再继续扫码。
- 产品优先绑定旧箱时，必须校验 `该箱历史有效数量 + 当前实时暂存数量 <= 目标装箱数`；超出时阻断绑定箱码。
- 强制装箱允许未满，但不允许超过目标装箱数。
- 服务端在生成正式箱记录和装箱明细的事务内必须再次校验产品码唯一性、箱码状态和容量，防止多窗口或多终端并发导致重复装箱或超装。

产品码和型号校验规则：

- 产品码有效装箱唯一。当前产品码已存在于历史有效装箱明细或当前实时装箱列表时，阻断装箱；已解绑明细不参与重复阻断，但历史状态保留。
- 产品码输入框回车时，系统必须按产品码查询追溯报表中该产品码按完工时间倒序的最新一条记录，取得该产品对应的产品型号，并立即校验该产品型号是否满足当前型号规则；不满足时阻断产品信息继续提交。
- 产品码获取产品型号的路径为：按产品码查询追溯报表中完工时间最新的一条记录，并取该记录中的产品型号；查不到记录、最新记录无产品型号或无法确定产品型号时，阻断产品码录入并提示产品码型号无法确定。
- 产品信息提交和服务端正式提交时，需再次复验追溯报表最新完工记录取得的产品型号是否满足当前型号规则，并将该产品型号作为装箱明细的产品型号快照。
- 按型号规则下，按产品码查询追溯报表最新记录取得的产品型号必须与当前产品型号一致；当前产品型号按作业页“当前产品型号确定规则”取得。
- 通用规则且 `箱内型号=仅同型号` 时，第一个扫入产品码取得的产品型号作为当前箱型号，后续产品码取得的产品型号必须与当前箱型号一致；通用规则且 `箱内型号=不限型号` 时不做型号一致性拦截。
- 当前箱内型号集合 = 该箱历史有效装箱明细的产品型号 + 当前页实时暂存产品的产品型号；已解绑明细不参与集合判断。
- `箱内型号=仅同型号` 时，当前箱内型号集合最多只能有一个型号；候选产品型号必须与箱内已有唯一型号一致。
- `箱内型号=不限型号` 时，不执行箱内型号集合一致性拦截，但仍需遵守通用规则、容量和产品码重复校验。

合格校验规则：

| 场景 | 系统判断 | 处理规则 |
| --- | --- | --- |
| 合格校验开启 | 产品码在配置校验工序存在 `NG` 或 `漏工序`。 | 阻断装箱；弹出一码追溯查询，展示结果、统计和已配置校验工序明细。 |
| 合格校验开启且全部通过 | 产品码在配置工序均为合格。 | 继续执行重复、型号和容量校验。 |
| 合格校验关闭 | 不读取工序校验结果。 | 仅执行产品码必填、格式、重复、型号和容量校验。 |

一码追溯查询弹窗展示规则：

- 弹窗只展示当前装箱规则中合格校验已配置的校验工序，不展示该产品的全部生产工序；合格校验关闭时不弹出该弹窗。
- 弹窗默认展示全部已配置校验工序，并统计合格工序数、不合格工序数、漏工序数。
- 点击 `查看异常数据` 后，仅展示结果为 `NG` 或 `漏工序` 的工序；切换后按钮文案变为 `查看全部数据`，再次点击恢复全部配置工序。
- 一码追溯结果优先级与标准产品一码追溯保持一致：存在 `漏工序` 时显示 `漏工序`；否则存在 `NG` 时显示 `NG`；否则显示 `OK`。
- 关闭弹窗或只查看异常数据不改变校验结论；当前产品信息提交继续保持阻断，产品码录入值和错误状态保留，便于操作员核对后更换产品码。

箱码补装规则：

| 场景 | 系统判断 | 处理规则 |
| --- | --- | --- |
| 箱码已满 | 历史有效数量 + 当前实时暂存数量已达到目标装箱数。 | 阻断继续装入，不受箱码再装策略影响。 |
| 箱码未满且策略为 `禁止再装` | 箱码已经完箱或强制装箱，但当前有效数量小于目标数量。 | 阻断补装。 |
| 箱码未满且策略为 `未满补装` | 箱码已经完箱或强制装箱，且当前有效数量小于目标数量。 | 允许补装；补装明细的装箱类型记为 `补装`。 |

旧箱补装规则：

- 旧箱允许补装时，是否允许补装、目标装箱数、箱内型号和箱体信息按该箱原箱级规则快照继续执行；补装新增产品的产品信息字段、产品保存值校验和合格校验按当前装箱设置执行。
- 扫描允许补装的旧箱码后，作业页带出该箱已有箱体信息和当前有效数量；箱体信息只读展示，不允许在补装过程中修改。
- 补装成功后新增有效装箱明细，新增明细保存本次补装时的产品信息快照；历史明细不反写，不新建第二个箱，也不删除原有解绑历史。
- 补装成功不触发完箱标签打印；如现场需要重新打印标签，应到标签管理按既有补打流程处理。

#### 3.3.7 装箱记录页

装箱记录页包含 `装箱明细` 和 `箱汇总` 两个视图。默认进入 `装箱明细`。两个视图均分页查询和分页展示，分页能力按系统标准分页规则执行。

| 视图 | 记录粒度 | 筛选区 | 工具栏 / 操作 | 导出 |
| --- | --- | --- | --- | --- |
| 装箱明细 | 一件产品一行。 | 箱码、产品码、关键词、明细状态、装箱类型、装箱时间范围。 | 勾选明细后批量 `解绑`。 | 支持导出，导出范围按当前筛选结果。 |
| 箱汇总 | 一个箱码一行。 | 箱码、装箱状态、完箱方式、完箱时间范围。 | `查看详情`。 | 不提供导出。 |

筛选默认值和查询限制：

| 视图 | 筛选项 | 默认值 | 查询规则 |
| --- | --- | --- | --- |
| 装箱明细 | 箱码 | 空 | 精确查询；输入后仅匹配完整箱码。 |
| 装箱明细 | 产品码 | 空 | 精确查询；输入后仅匹配完整产品码。 |
| 装箱明细 | 关键词 | 空 | 对产品信息保存值、箱体信息保存值、明细状态、装箱类型、装箱时间、装箱人、解绑时间、解绑人等可关联信息做模糊搜索。 |
| 装箱明细 | 明细状态 | 全部 | 可选 `全部 / 有效 / 已解绑`。 |
| 装箱明细 | 装箱类型 | 全部 | 可选 `全部 / 正常装箱 / 补装`。 |
| 装箱明细 | 装箱时间范围 | 默认近 7 天，结束时间为当前时间 | 必填；单次查询跨度最大 31 天，超过时阻断查询并提示缩小时间范围。 |
| 箱汇总 | 箱码 | 空 | 精确查询；输入后仅匹配完整箱码。 |
| 箱汇总 | 装箱状态 | 全部 | 可选 `全部 / 已满箱 / 未满箱`。 |
| 箱汇总 | 完箱方式 | 全部 | 可选 `全部 / 正常装箱 / 强制装箱`。 |
| 箱汇总 | 完箱时间范围 | 默认近 7 天，结束时间为当前时间 | 必填；单次查询跨度最大 31 天，超过时阻断查询并提示缩小时间范围。 |

分页规则：

- `装箱明细` 和 `箱汇总` 均必须分页查询和分页展示，按系统标准分页规则执行。

装箱明细字段：

| 字段 | 来源 | 是否默认展示 | 是否允许取消展示 | 有值规则 |
| --- | --- | --- | --- | --- |
| 箱码 | 固定字段 | 是 | 否 | 所属箱码。 |
| 产品码 | 固定字段 | 是 | 否 | 产品信息提交时的产品码。 |
| 产品型号 | 追溯报表 | 是 | 否 | 产品码回车时按产品码查询追溯报表中完工时间最新的一条记录取得产品型号，并在正式装箱明细生成时保存快照；追溯报表后续变更不反写历史明细。 |
| 明细状态 | 系统状态 | 是 | 否 | `有效 / 已解绑`。 |
| 装箱类型 | 系统状态 | 是 | 可配置展示 | `正常装箱 / 补装`。 |
| 产品信息保存值 | 保存值配置 | 按配置 | 可配置展示 | 按产品信息提交时的快照保存。 |
| 箱体信息保存值 | 保存值配置 | 按配置 | 可配置展示 | 按箱体信息提交时的快照保存。 |
| 装箱时间 | 系统记录 | 是 | 否 | 正式装箱明细生成时间。 |
| 装箱人 | 当前登录用户 | 是 | 可配置展示 | 生成正式装箱记录和装箱明细时的登录用户。 |
| 解绑时间 | 系统记录 | 是 | 否 | 仅已解绑明细有值。 |
| 解绑人 | 登录用户 | 是 | 可配置展示 | 仅已解绑明细有值。 |

记录页动作规则：

| 动作 | 触发条件 | 校验 | 成功后 | 失败后 / 弹窗 |
| --- | --- | --- | --- | --- |
| 查询 | 点击查询或切换筛选条件后执行。 | 时间范围必填且跨度不超过 31 天。 | 按筛选条件刷新列表。 | 阻断查询并提示缩小时间范围。 |
| 重置 | 点击重置。 | 无。 | 筛选条件恢复默认值。 | 无。 |
| 查看详情 | 箱汇总点击 `查看详情`。 | 箱记录存在。 | 打开箱详情，展示箱体信息、装箱状态、完箱方式、装箱数量和箱内产品明细历史。 | 记录不存在时提示已被更新或删除。 |
| 解绑 | 装箱明细勾选有效明细后点击 `解绑`。 | 已选择明细；已解绑明细不可重复解绑。 | 二次确认后明细状态更新为 `已解绑`，记录解绑时间和解绑人。 | 未选择、重复解绑或无权限时阻断。 |
| 导出 | 装箱明细视图点击 `导出`。 | 满足当前筛选条件和时间跨度限制。 | 按当前筛选结果、当前展示字段和追溯导出配置生成导出文件。 | 超过查询跨度或无权限时阻断。 |

记录页按钮状态：

- `解绑` 仅在 `装箱明细` 视图展示；切换到 `箱汇总` 视图时不展示。
- 装箱明细未勾选有效明细时，`解绑` 不可用；勾选有效明细后可用，并可展示已选数量。
- 已解绑明细的勾选框不可用，不参与全选；全选只选择当前页可解绑的有效明细。
- 无解绑权限时不展示 `解绑`，或按系统权限组件置为不可用并提示无权限。

记录保存口径：

- 完箱、强制装箱或补装提交成功后，形成正式箱记录和产品装箱明细。
- 箱记录保留箱码、目标装箱数、箱体信息快照、装箱状态、完箱方式和完箱时间，用于箱汇总和箱详情查看。
- 产品装箱明细保留箱码、产品码、产品型号快照、产品信息保存值、箱体信息保存值、装箱类型、明细状态、装箱时间和装箱人，用于装箱明细查询、解绑和导出。
- 历史记录按生成时的设置和保存值快照展示，后续设置变更不反写历史记录。

解绑规则：

- 仅装箱明细视图支持解绑。
- 用户需先勾选装箱明细，再点击工具栏 `解绑`。
- 解绑前需二次确认；弹窗展示本次解绑数量，按钮为 `确定 / 取消`。
- 解绑不物理删除历史明细；解绑后的产品码不再参与产品码重复阻断。
- 解绑只更新所选明细状态，并记录解绑时间和解绑人；不删除箱记录，也不删除原装箱明细。
- 解绑导致箱内有效数量低于目标数量时，后续是否允许补装按 `箱码再装` 策略判断。

箱汇总规则：

| 字段 / 状态 | 规则 |
| --- | --- |
| 装箱状态 | 按有效数量是否达到目标数量展示为 `已满箱 / 未满箱`。 |
| 完箱方式 | 取该箱最后一次正式完箱提交的结果；最后一次提交达到目标数量展示 `正常装箱`，最后一次提交未满结束展示 `强制装箱`。解绑只影响有效数量和装箱状态，不单独改写完箱方式。 |
| 完箱时间 | 取该箱最后一次正式完箱提交成功时间；首次正常装箱、强制装箱或后续补装完成时，均以该次提交成功时间作为最新完箱时间。 |
| 装箱数量 | 合并展示为 `有效数量 / 目标数量`。 |
| 箱体信息保存值 | 取箱体信息提交时保存的箱级快照；箱汇总不默认按自定义箱体信息追加展示列，也不通过隐藏的箱体信息做关键词检索；箱详情固定展示该箱完整箱体信息。 |
| 查看详情 | 展示该箱箱体信息、装箱状态、完箱方式、装箱数量和箱内产品明细历史。 |

导出规则：

- 装箱明细导出由基础装箱字段和追加追溯字段组成。
- 基础装箱字段来自装箱明细当前展示列，字段顺序按装箱明细字段配置。
- 追加追溯字段来自设置页 `导出追溯数据` 配置；系统按产品码查询指定工序的采集参数、物料参数和配方参数，并追加到导出结果。
- 同一产品码在同一配置工序存在多条完工记录时，导出取该工序完工时间最新的一条记录。
- 未查询到配置工序的完工记录、最新完工记录中没有对应参数值或参数值无法取得时，该追加追溯字段导出空值，不阻断导出。
- 导出追溯数据只影响装箱明细导出，不作为装箱作业录入项，也不代表写回追溯报表。

#### 3.3.8 完箱标签打印

完箱标签打印为装箱完成后的可选动作。装箱管理关联 LMES 标准标签打印流程使用，负责在完箱后准备打印流程输入、主动写入变量并触发流程；标签模板、打印机、打印次数、数据映射、打印记录和补打仍在标签管理 / 标准标签打印流程中维护。

打印用产品识别码取值路径：

- 装箱管理先按作业页“当前产品型号确定规则”确定当前产品型号。
- 装箱管理再按当前产品型号查询产品管理，取得该型号对应的产品识别码。
- 查询到唯一产品识别码时，将该产品识别码写入装箱设置中配置的 `打印产品识别码` 变量。
- 未查询到产品识别码、查询到多个产品识别码或当前产品型号无法确定时，不写入打印触发信号，不触发标准标签打印流程；页面提示打印输入不足，已生成的装箱记录不回滚。

完箱标签打印开启后，装箱管理需向标准标签打印流程提供以下数据：

| 数据 | 写入 / 读取 | 取值规则 | 对应标准流程 |
| --- | --- | --- | --- |
| 打印触发信号 | 写入 | 完箱记录和打印输入准备完成后，写入触发值；建议按现场信号约定使用 `1` 表示触发，标准流程处理完成后由流程或设备复位。 | 触发标签打印流程执行。 |
| 产品识别码 | 写入 | 按当前产品型号查询产品管理取得唯一产品识别码，并写入装箱设置中配置的 `打印产品识别码` 变量；无法唯一确定时，不触发打印并提示打印输入不足，装箱记录不回滚。 | `LabelPrintProductValue`。 |
| 扩展打印数据源 | 写入 | 至少包含箱码、装箱数量、目标数量、完箱方式、装箱时间、装箱人；可包含产品信息保存值、箱体信息保存值和配置的追溯导出字段；不写入产品码作为打印输入。 | `LabelPrintDataSource`。 |
| 打印结果 | 读取 | 读取标准标签打印流程回写的结果值。 | `LabelPrintResultValue`。 |
| 打印说明 | 读取 | 用于页面展示失败原因或成功说明。 | `LabelPrintDescriptionValue`。 |

打印结果处理：

| 打印结果码 | 含义 | 装箱管理处理 |
| --- | --- | --- |
| `0` | 复位 / 等待 | 展示未收到成功结果的提示，不回滚装箱记录。 |
| `1` | 成功 | 展示标签打印成功。 |
| `2` | 失败 | 展示具体失败说明，引导到标签管理查看打印记录或补打；不回滚装箱记录。 |
| `3` | 打印机连接失败 | 展示连接失败说明，引导检查打印代理、打印机或网络；不回滚装箱记录。 |

打印触发顺序：

1. 装箱业务校验通过。
2. 生成正式箱记录和装箱明细。
3. 如开启完箱标签打印，装箱管理组装标准标签打印流程输入数据。
4. 装箱管理按当前产品型号查询产品管理，取得唯一产品识别码后写入打印产品识别码变量，同时写入扩展打印数据源；不写入产品条码 / 产品码。
5. 装箱管理写入打印触发信号，触发标准标签打印流程执行。
6. 标准标签打印流程执行 `打印初始化 -> 标签打印`，并回写打印结果和打印说明。
7. 装箱管理读取打印结果信号和打印说明，并在作业页展示。
8. 无论打印成功或失败，已生成的装箱记录不回滚。

#### 3.3.9 数据来源与跨模块影响

| 来源模块 / 数据 | 使用页面 | 使用方式 | 规则 |
| --- | --- | --- | --- |
| 条码管理 | 装箱设置、装箱作业 | 保存值和固定字段可选择条码校验规则。 | 未选择时不做格式校验；选择后每次录入、重复使用和变量获取值均按规则校验。 |
| 产品管理 | 装箱设置、装箱作业、完箱打印 | 规则适用产品型号、产品型号选择弹窗、产品识别码变量匹配、按产品型号查询打印用产品识别码。 | 产品型号选择和产品识别码变量匹配以产品管理为来源；完箱打印写入的产品识别码按当前产品型号查询产品管理取得。 |
| 工序管理 | 装箱设置 | 合格校验工序、导出追溯数据工序选择。 | 合格校验开启时至少选择一个工序；导出追溯同一工序只允许配置一次。 |
| 追溯报表 / 过程追溯 | 装箱作业、装箱记录导出 | 产品码查询产品型号、产品码合格校验、导出时追加追溯字段。 | 产品码型号按追溯报表中该产品码完工时间最新的一条记录取得；合格校验判断 `OK / NG / 漏工序`，结果优先级为 `漏工序 > NG > OK`；导出按产品码查询指定工序完工时间最新一条记录的参数。 |
| 变量 / 信号配置 | 装箱设置、装箱作业、完箱打印 | 保存值变量获取、产品识别码变量获取、打印触发、打印产品识别码和打印结果。 | 变量获取字段提交所属对象时读取并校验；打印相关变量按标准标签打印流程使用。 |
| 标签管理 / 标准标签打印流程 | 装箱设置、装箱作业 | 完箱后触发标签打印并读取结果。 | 模板、打印机、打印次数、数据映射、打印记录和补打不在装箱管理维护。 |
| 当前登录用户 | 装箱作业、装箱记录 | 生成装箱人、解绑人。 | 装箱人取生成正式装箱记录和明细时的登录用户；解绑人取执行解绑时的登录用户。 |
| 装箱管理自身数据 | 装箱作业、装箱记录 | 装箱设置、保存值配置、装箱规则、实时暂存、箱记录、装箱明细、解绑历史、导出配置、打印信号配置。 | 产品码唯一性、箱码状态、箱容量和补装数量必须在服务端事务内复验。 |

并发控制要求：

- 产品码有效装箱唯一性必须在服务端校验，避免多窗口或多终端同时扫描同一产品码。
- 箱码有效箱唯一性、箱容量和补装数量必须在生成正式记录的事务内校验。
- 前端提示不能代替服务端校验；服务端校验失败时，作业页需展示失败原因并保留当前可恢复的录入状态。

#### 3.3.10 权限点

| 权限点 | 控制范围 |
| --- | --- |
| 装箱作业 | 进入装箱作业页并执行扫码装箱。 |
| 装箱设置维护 | 查看和保存装箱设置、保存值、规则、记录字段、导出追溯数据和打印信号。 |
| 强制装箱 | 未满箱时执行强制装箱。 |
| 修改箱信息 | 在箱码优先模式下修改当前未完箱的箱体信息。 |
| 装箱记录查询 | 查看装箱明细、箱汇总和箱详情。 |
| 解绑 | 对正式装箱明细执行解绑。 |
| 导出 | 导出装箱明细及配置的追溯数据。 |

#### 3.3.11 验收口径

- 装箱管理在 LMES 主系统中提供 `装箱作业`、`装箱记录`、`装箱设置` 三个页面。
- 装箱设置页按 `装箱设置 / 保存值配置 / 规则设置 / 记录与导出` 组织配置，完箱标签打印相关字段写入 `装箱设置` 区域；顶部保存操作区需吸顶展示，提供 `保存设置`、`放弃修改` 和保存状态。
- 设置页存在未保存修改时，系统内离开设置页需弹窗提示，按钮仅保留 `继续编辑 / 放弃修改`，且 `继续编辑` 为主按钮；保存失败需定位到第一个错误区域并展示错误原因。
- 装箱设置中可配置 `箱码优先 / 产品优先`，且作业页按模式改变产品信息和箱体信息的录入顺序。
- 产品码、箱码固定存在，默认空值，作业提交时必须有值；产品码、箱码固定扫码 / 录入，不支持变量获取。
- 保存值按 `产品信息 / 箱体信息` 分组维护，支持 `每次录入 / 重复使用 / 变量获取`；变量获取字段提交所属对象时需读取变量值并执行非空和格式校验。
- 变量获取字段读取失败、超时、返回空值或字符串去除首尾空格后为空时，阻断所属对象提交；数值 `0` 和布尔值 `false` 不按空值处理。
- 箱体信息保存值随箱记录保存，并必须随产品装箱明细冗余保存用于明细查询和导出；箱详情固定展示完整箱体信息快照，箱汇总不默认展开自定义箱体信息列，也不通过隐藏的箱体信息做关键词检索。
- 设置保存时必须校验必填项、条件必填项、保存值名称全局唯一性、装箱数、产品型号规则唯一性、变量配置、合格校验工序、完箱打印信号和导出追溯配置；保存成功后成为最新装箱设置，不因当前或其他浏览器存在未提交装箱作业而阻断。
- 其他浏览器保存装箱设置后，当前已打开的作业页需检测装箱设置变化：无未完箱数据时自动切换并提示已更新；有未完箱数据时常驻提示当前箱仍按原设置执行，完成当前箱或清空当前作业后使用最新设置。
- 装箱作业页存在未完箱暂存数据时，切换菜单或进入系统内其他页面后再返回，系统自动恢复当前箱、实时装箱列表、录入值、校验状态和当前箱开始时的设置，不要求操作员弹窗确认；刷新、关闭页签或关闭浏览器时按浏览器能力提示，确认离开后不保证恢复。
- 手动产品型号选择使用弹窗，弹窗仅展示已配置在启用装箱规则中的产品，列表字段为产品名称、产品型号。
- 每次录入字段回车后即时校验，通过显示绿色 `√` 并跳转，失败显示红色 `×` 并阻断提交。
- 产品码回车时必须校验重复性并按当前型号规则校验产品型号；历史有效装箱明细和当前实时装箱列表均不可重复；系统按产品码查询追溯报表中完工时间最新的一条记录取得产品型号。按型号规则下，查询到的产品型号必须与当前选择或变量匹配的型号一致；通用规则且 `箱内型号=仅同型号` 时，第一个扫入产品码的产品型号作为当前箱型号，后续产品型号必须一致；通用规则且 `箱内型号=不限型号` 时不做型号一致性拦截。
- 合格校验开启时，产品码在配置校验工序存在 `NG` 或 `漏工序` 结果应阻断装箱，并弹出一码追溯查询；弹窗默认展示已配置的全部校验工序，可切换为 `查看异常数据`，结果优先级为 `漏工序 > NG > OK`。
- 箱码优先模式下，箱体信息未完成前不能录入产品信息；当前箱成立后可通过 `修改箱信息` 弹窗修改未完箱的箱体信息。
- 产品优先模式下，产品数量达到目标数量后才能按正常路径录入箱体信息；未满时只能通过 `强制装箱` 补齐箱体信息并提交。
- 扫描旧箱补装时，是否允许补装、目标装箱数、箱内型号和箱体信息按该箱原箱级规则快照继续执行，带出原箱体信息且不可修改；补装新增产品的产品信息字段、产品保存值校验和合格校验按当前装箱设置执行；容量按 `历史有效数量 + 当前实时暂存数量` 判断，不允许超出目标数量。
- `箱码再装=禁止再装` 时，已完箱或强制装箱的旧箱不允许继续装入；`未满补装` 时，未满旧箱可继续补装，补装明细标记为 `补装`。
- `箱内型号=仅同型号` 时，当前箱内有效明细和实时暂存产品的型号集合必须一致，候选产品型号与箱内已有唯一型号不一致时应阻断装箱或补装。
- 手动切换产品型号、变量获取型号变化或配置刷新导致当前产品型号变化，且当前页已有未完箱数据时，需二次确认；确认文案需说明会清空当前页面已扫码但还没有完成装箱 / 强制装箱的内容。变量获取型号变化时，操作员也可暂不切换并完成当前箱，当前箱完成或清空后系统重新读取变量并刷新型号。
- 作业页支持 `清空当前作业`，仅清空当前页未提交的装箱数据，不会删除已经在装箱记录页可查询的记录；该操作必须二次确认，不记录装箱业务日志。
- 产品优先或箱码优先达到目标装箱数后，均不得继续提交产品码或产品信息；满箱人工确认时仅允许点击 `装箱`、删除实时暂存产品或修改箱信息。
- 满箱自动完成时，达到目标数量后自动生成正式装箱记录；人工确认时需点击 `装箱`；强制装箱生成未满箱记录。
- 装箱完成后清空实时装箱列表、每次录入值、变量读取状态和字段校验状态，并自动聚焦下一次录入；如存在最新装箱设置，下一箱加载最新设置。
- 装箱记录默认进入 `装箱明细`，支持箱码 / 产品码精确查询、关键词模糊搜索、状态筛选、时间范围筛选、解绑和导出；箱汇总仅按列表可见筛选项查询，不通过隐藏字段做关键词检索。
- 装箱明细和箱汇总的时间范围默认近 7 天，单次查询最大跨度 31 天；超过最大跨度时阻断查询并提示缩小时间范围。
- 装箱明细和箱汇总均需分页展示，分页能力按系统标准分页规则执行。
- 箱汇总按箱码展示 `已满箱 / 未满箱`、`正常装箱 / 强制装箱`、完箱时间和 `有效数量 / 目标数量`，支持查看箱详情，不提供导出；完箱方式和完箱时间取该箱最后一次正式完箱提交结果，解绑只影响有效数量和装箱状态，不单独改写完箱方式。
- 解绑需勾选装箱明细后点击独立按钮，并二次确认；解绑后保留历史状态、解绑时间和解绑人。
- 装箱明细导出按当前筛选结果和当前展示字段导出；配置导出追溯数据后，按配置工序和参数顺序追加追溯字段；同一产品码在同一配置工序存在多条完工记录时，取该工序完工时间最新的一条记录；未查询到记录或参数值无法取得时导出空值。
- 完箱标签打印开启后，装箱管理需先确定当前产品型号，再按当前产品型号查询产品管理取得唯一产品识别码，并写入打印产品识别码变量；随后写入扩展打印数据源和打印触发信号，触发标准标签打印流程，并读取 `0 / 1 / 2 / 3` 结果及打印说明；装箱管理不写入产品条码 / 产品码作为打印输入，打印失败或连接失败只提示，不回滚装箱记录。

### 3.4 设备状态分析

#### 3.4.1 原始需求

| 需求编号 | 原始需求内容 | 期望结果 |
| --- | --- | --- |
| R-290-005 | 组件回收：设备状态统计。 | 沉淀为 LMES 标准产品中的设备状态分析能力，支持按设备、时间和统计口径查看设备状态结构、异常设备排行、单设备状态时间轴、状态诊断、周期汇总和状态时间明细。 |

#### 3.4.2 场景和目标

生产管理、设备管理和现场班组需要复盘设备在一段时间内的运行、停机、故障以及其他状态占比，定位停机或故障时长较高的设备，并进一步查看单台设备在不同日期、班次、状态类别和状态原因下的发生情况。现有标准资料中，监控看板可展示实时设备状态，生产统计侧重产量、节拍和不合格分析，尚缺少面向设备状态时长的专题分析页面。

本版新增 `设备状态分析` 能力，目标如下：

- 在设备总览中按设备范围查看整体状态结构、Top 设备排行和设备汇总表，帮助用户快速定位异常设备。
- 在单设备分析中查看状态卡片、状态诊断、状态时间轴、周期汇总表和状态时间明细，帮助用户从设备状态下钻到状态类别和状态原因。
- 支持自然日和班次日两种统计口径，支持累计时长、发生次数和时长占比等分析指标。
- 通过汇总展示设置控制汇总区域中直接展示的真实设备状态，以及被合并到“其他状态”的真实设备状态。
- 统一导出图表、设备汇总表、周期汇总表和状态时间明细，便于离线复盘和问题沟通。

#### 3.4.3 通用规则

本节只放跨页面共用的规则。设备总览、单设备分析、汇总展示设置弹窗和状态时间明细弹窗的页面组成与交互规则分别写在后续页面章节内。

**功能边界与数据来源**

| 边界项 | 规则 |
| --- | --- |
| 功能定位 | 设备状态分析定位为分析展示页面。设备台账、设备状态配置、状态采集、状态判定、状态优先级由基座承担。 |
| 设备台账 | 从基座读取设备清单和设备名称，LMES 设备状态分析不维护设备台账。 |
| 设备状态主数据 | 从基座读取真实设备状态；用户在基座维护设备状态，LMES 不提供设备状态维护入口。 |
| 状态类别 / 状态原因 | 基座启用状态原因分析后，LMES 才展示状态类别、状态原因相关分析层级、筛选和列；状态原因按基座采集到的字符串精确聚合。 |
| 状态优先级 | 同一设备同一时间的最高优先级状态由基座保证；LMES 不展示优先级，也不重新判定优先级。 |
| 分析数据源 | 统一读取基座状态时长原始表，典型字段包括设备名称、开始时间、结束时间、累计时长、设备状态、状态类别、状态原因。 |
| 数据写入 | 设备状态分析只查询和计算，不改写基座状态时长原始数据。 |
| 颜色配置 | 基座不提供颜色配置时，LMES 为设备状态稳定分配颜色；本期不提供颜色配置维护入口。 |

**状态名称与系统名称**

| 项目 | 规则 |
| --- | --- |
| 页面展示 | LMES 页面所有可见状态文本、筛选项、表格列、面包屑、hover、弹窗和导出字段均展示基座 `状态名称`，不展示 `系统名称`。 |
| 内部识别 | `系统名称` 仅用于 LMES 识别固定三态、汇总展示设置初始默认勾选项、默认排行状态和默认颜色等内部口径。 |
| 固定三态 | 基座固定三态的系统名称为 `运行 / 停机 / 故障`，系统名称固定；对应 `状态名称` 可由用户在基座自定义。 |
| 展示示例 | 若基座系统名称为 `故障`、状态名称为 `报警`，LMES 页面展示 `报警`，但内部仍按固定三态中的故障状态处理。 |
| 用户新增状态 | 用户在基座新增的其他真实设备状态可参与总览、排行、诊断、时间轴、周期汇总和明细分析，页面仍展示其状态名称。 |

**时间范围与统计口径**

| 规则项 | 规则 |
| --- | --- |
| 默认范围 | 默认查询最近 7 天，包含当前日期。 |
| 最大跨度 | 单次查询日期范围最大 31 天，超过时阻断查询并提示 `查询范围不能超过 31 天，请缩小日期范围`。 |
| 日期边界 | 日期范围包含首尾日期；时间选择粒度到天，不支持按小时或分钟选择开始结束时间。 |
| 自然日 | 自然日按 `00:00-24:00` 统计。 |
| 班次日 | 班次日按基座唯一班次配置解释统计周期，班次日期为班次开始日期。 |
| 班次缺失 | 若没有班次配置，则班次日口径不可用或置灰，自然日口径仍可使用。 |
| 口径切换 | 切换自然日 / 班次日时，日期范围不变，系统按新统计口径重新解释统计周期。 |

**指标与计算口径**

| 指标 | 规则 |
| --- | --- |
| 累计时长 | 按当前筛选范围内状态区间持续时长累计；跨周期时按周期边界拆分时长。 |
| 发生次数 | 设备状态次数按一段连续状态区间计 1 次；状态类别 / 状态原因次数按原始区间记录条数计次，不做 LMES 二次连续合并。 |
| 跨周期计次 | 状态区间跨周期时，发生次数只计入状态区间开始所在周期，不因时长拆分重复计次。 |
| 时长占比 | 分母为当前筛选范围内的状态记录总时长；无状态记录时间不补成任何状态，也不作为占比分母。 |
| 次数占比 | 分母为当前父级下有记录项的发生次数合计。 |
| 单次平均时长 | 单次平均时长 = 累计时长 / 发生次数；发生次数为 0 时显示 `--`。 |
| 空占比 | 分母为 0 时占比显示 `--`。 |

基座启用状态原因分析时，状态类别和状态原因为空显示 `--`，并作为正常分组参与排行、点击、面包屑、时间轴高亮、周期汇总表和状态时间明细筛选；不改写为“未记录原因”等解释文案。基座未启用状态原因分析时，页面不展示状态类别和状态原因相关筛选、列、面包屑层级、时间轴 hover 字段或导出字段。

**颜色基本规则**

- 系统名称为 `运行 / 停机 / 故障` 的固定三态使用稳定默认颜色；页面展示文本仍取其状态名称。
- 其他真实设备状态按系统稳定顺序分配扩展色。
- “其他状态”聚合项统一使用灰色；被合并的真实设备状态在状态诊断、时间轴和明细中仍使用自身真实状态颜色。
- 状态类别和状态原因不配置独立颜色，均沿用所属设备状态颜色。

#### 3.4.4 设备总览页

设备总览页用于在设备范围内快速定位异常设备。页面只承担总览定位职责，不做状态诊断下钻；诊断下钻发生在单设备分析页。

**页面组成**

| 组成部分 | 页面职责 |
| --- | --- |
| 顶部筛选区 | 控制设备总览的数据范围。 |
| 顶部操作区 | 提供汇总展示设置和总览图表导出入口。 |
| 总览摘要 / 整体状态结构 | 展示设备范围、有状态记录设备数和当前设备范围内的整体状态时长占比。 |
| Top 设备排行 | 按某个真实设备状态的累计时长或发生次数定位重点设备。 |
| 设备汇总表 | 一行一设备查看完整汇总数据，并作为进入单设备分析的表格入口。 |

**顶部筛选区**

| 筛选项 | 规则 |
| --- | --- |
| 开始日期 / 结束日期 | 默认最近 7 天；遵守 31 天最大查询跨度。 |
| 统计口径 | 支持 `自然日 / 班次日`；无班次配置时班次日不可用或置灰。 |
| 设备范围 | 支持搜索多选；未选择具体设备时按全部设备处理；选择部分设备时展示已选数量。 |

设备范围变化后，总览摘要、整体状态结构、Top 设备排行和设备汇总表均按当前设备范围即时刷新。Top 设备排行平均线按参与排行的设备重算；设备汇总表和导出均只包含当前设备范围内设备。

**顶部操作区**

| 操作 | 规则 |
| --- | --- |
| 汇总展示设置 | 打开汇总展示设置弹窗，保存后影响本页整体状态结构和设备汇总表状态列。 |
| 导出图表 | 导出本页整体状态结构和 Top 设备排行；整体状态结构需包含完整状态摘要，Top 设备排行需包含当前排行数据的完整排行项，不只导出滚动区域当前可见部分。 |

图表导出的具体实现形式，如长图、分页图片或 PDF 分页，由研发评审确定；PRD 不限定具体图片生成方式。

**总览摘要 / 整体状态结构**

- 摘要展示当前设备范围内的设备数量和有状态记录的设备数量，单位为 `台`。
- 整体状态结构表达当前设备范围内各状态的状态时长占比，不作为下钻入口。
- 整体状态结构按汇总展示设置展示直接展示状态和“其他状态”；“其他状态”仅在存在未直接展示的真实状态时展示。
- 状态摘要展示状态名称、状态时长占比和涉及设备数；直接展示状态即使当前无数据，也按 `0.0% / 0 台` 展示，避免用户误认为配置未生效。
- 整体状态结构图分段 hover 展示状态名称、状态时长占比、涉及设备数。
- 状态摘要在页面空间不足时可收纳、滚动或下拉展示；导出图表时必须包含完整状态摘要。

**Top 设备排行**

| 项目 | 规则 |
| --- | --- |
| 默认排行 | 默认按系统名称为 `停机` 的设备状态累计时长从大到小排行；页面下拉和图表展示该状态的基座状态名称。 |
| 排行状态 | 使用下拉选择真实设备状态；下拉展示状态名称，不受汇总展示设置影响，不展示“其他状态”。 |
| 排序指标 | 支持 `累计时长 / 发生次数` 切换。 |
| 数据范围 | 只展示当前设备范围内、且当前排行状态有记录的设备；无该状态记录的设备不参与排行。 |
| 平均线 | 按参与排行的设备重新计算，不包含无该状态记录设备。 |
| 展示数量 | 当前筛选范围内存在该状态记录的设备尽量全部展示；设备过多时允许横向滚动。 |
| 点击下钻 | 点击设备柱进入单设备分析，并带入该设备和当前排行状态。 |

切换排行状态或排序指标时，柱状图、柱顶数值、平均线和 hover 信息同步刷新，不改变顶部筛选区的开始日期、结束日期、统计口径和设备范围。排行图 hover 展示完整设备名称、当前排行状态、当前指标完整值、高于 / 低于平均值多少。

**设备汇总表**

- 一行一台设备，当前设备范围内无状态记录的设备也需要展示。
- 表格保留总记录时长字段。
- 状态列按汇总展示设置展示，状态单元格展示状态时长和时长占比。
- 未直接展示的真实状态合并为“其他状态”；如果全部真实状态均直接展示，则不展示“其他状态”列。
- “其他状态”单元格 hover 展示该设备被合并的具体真实设备状态。
- 点击设备汇总表整行或设备名称进入单设备分析，不带入状态。
- 点击设备汇总表中的真实状态单元格进入单设备分析，并带入该真实状态；点击空值 `--` 或无记录状态单元格时不带入状态。
- 设备汇总表分页展示，分页能力沿用系统标准表格组件。
- 设备汇总表右上角提供 `导出`，导出当前设备范围和查询条件下的设备信息全集，不只导出当前分页，不导出筛选范围外设备。

**页面切换与下钻**

- 设备状态分析页面默认进入 `设备总览`。
- 设备总览页和单设备分析页共享开始日期、结束日期和统计口径；任一页调整后，切换到另一页时沿用最新日期范围和统计口径重新计算。
- 设备总览页的设备范围、Top 排行状态、排行指标和设备汇总表分页属于总览页上下文；切换到单设备分析页再返回时保持不变。
- 单设备分析页的当前设备、当前最深选中层级、状态诊断排序口径和周期汇总表分页属于单设备页上下文；手动切换到设备总览页再返回时保持不变。
- 从设备总览页点击设备柱、设备行、设备名称或真实状态单元格进入单设备分析时，以本次点击目标重新初始化单设备页的当前设备和带入状态；带入状态规则按 Top 设备排行和设备汇总表入口各自规则执行。
- 在单设备分析页直接切换设备不反向改变设备总览页的设备范围、Top 排行状态、排行指标或设备汇总表分页。

#### 3.4.5 单设备分析页

单设备分析页用于查看单台设备的状态结构、诊断下钻、时间轴和周期趋势。页面内的状态卡片、状态诊断、状态时间轴、周期汇总表和状态时间明细弹窗使用同一套当前分析上下文。

**页面组成**

| 组成部分 | 页面职责 |
| --- | --- |
| 顶部筛选区 | 选择单台设备、时间范围和统计口径。 |
| 顶部操作区 | 提供汇总展示设置和单设备图表导出入口。 |
| 状态卡片区 | 汇总展示直接展示状态和“其他状态”，提供真实状态的快捷选择入口。 |
| 状态诊断 | 从 `全部状态` 下钻到设备状态、状态类别和状态原因，形成当前最深选中层级。 |
| 状态时间轴 | 展示完整状态流转，并按当前最深选中层级高亮命中片段。 |
| 周期汇总表 | 展示当前分析对象在自然日或班次周期下的趋势。 |

**顶部筛选区**

| 筛选项 | 规则 |
| --- | --- |
| 设备 | 单选设备；从总览进入时带入被点击设备，用户也可在单设备页直接切换设备。 |
| 开始日期 / 结束日期 | 默认最近 7 天；遵守 31 天最大查询跨度。 |
| 统计口径 | 支持 `自然日 / 班次日`；切换后状态时间轴刻度、时间轴周期行和周期汇总表同步刷新。 |

切换设备后，清空已选设备状态、状态类别和状态原因；状态诊断回到 `全部状态`；状态卡片选中态清空；时间轴不做高亮；周期汇总表回到周期 + 全部真实设备状态；时间范围、统计口径和状态诊断排序口径保持不变。

切换时间范围或统计口径时，不清空当前状态诊断层级和当前最深选中对象，按新范围重新计算。当前选择在新时间范围无记录时，不自动回退到上级层级；状态诊断展示对应空态，状态卡片保留选中态，时间轴仍展示完整时间轴但不出现高亮段，周期汇总表按当前对象补 0，状态时间明细弹窗继承当前选择并显示空结果。

**顶部操作区**

| 操作 | 规则 |
| --- | --- |
| 汇总展示设置 | 打开汇总展示设置弹窗，保存后影响本页状态卡片区。 |
| 导出图表 | 导出本页状态卡片、状态诊断排行和状态时间轴等当前分析上下文图表内容。 |

状态诊断区不提供独立导出按钮，随单设备 `导出图表` 一起导出。若状态诊断排行或状态时间轴在页面内滚动，导出仍需包含完整图表内容，不只导出当前可见区域。状态时间明细弹窗不属于 `导出图表` 范围。

**状态卡片区**

- 按汇总展示设置展示直接展示状态卡片和“其他状态”汇总卡；不展示“全部状态”卡片。
- 直接展示状态卡片展示累计时长、时长占比、发生次数和单次平均时长。
- 状态卡片按稳定卡片高度和栅格展示，一行最多展示 4 个；状态数量少于 4 个时不强制拉满整行。
- 单设备状态卡片数量按最终可见卡片数计算，即直接展示状态卡片数量 + 是否存在“其他状态”卡片；最终可见卡片数不超过 8 个时，展示为 1 到 2 行完整卡片。
- 最终可见卡片数超过 8 个时，状态卡片区固定最大展示高度，超出部分在卡片区内部滚动或收纳展示，不继续撑高页面挤压状态诊断和状态时间轴。
- 卡片进入紧凑展示时，至少保证状态名称、累计时长和时长占比可直接读取；发生次数和单次平均时长可压缩到同一行展示，但不应被滚动区域或收纳状态遮挡。
- “其他状态”卡片是聚合摘要，不作为诊断入口；点击“其他状态”不进入状态诊断链路。
- 被合并的真实设备状态仍从状态诊断 `全部状态` 排行中进入分析。
- 点击直接状态卡片的效果等同于点击状态诊断 `全部状态` 排行中的同一真实状态。
- 已选状态支持取消和直接切换；点击已选中的直接状态卡片可回到 `全部状态`，点击其他直接状态卡片则直接切换。
- 若当前选中的真实状态不在直接展示卡片中，“其他状态”卡片可表达选中态，并轻量提示已选真实状态。

**状态诊断**

状态诊断常驻展示，默认根层级为 `全部状态`。`全部状态` 层展示当前设备、当前时间范围内有记录的全部真实设备状态，不展示“其他状态”，不受汇总展示设置影响。

| 项目 | 规则 |
| --- | --- |
| 启用状态原因分析 | 支持 `全部状态 > 设备状态 > 状态类别 > 状态原因`，最多 4 层。 |
| 未启用状态原因分析 | 状态诊断只停留在 `全部状态`，点击状态行只选中该真实状态并联动状态卡片、时间轴和周期汇总表，不进入类别 / 原因层级。 |
| 面包屑 | 最少 1 层、最多 4 层；最后一层只展示不可点击，上级层级可点击返回。 |
| 空值路径 | 状态类别或状态原因为空时，面包屑显示 `--`。 |

状态诊断下钻和面包屑返回只改变当前最深选中层级，不改变顶部设备、时间范围、统计口径和排序口径。面包屑单行展示，长状态名称、状态类别或状态原因可省略展示，hover 展示完整值；导出图表时应保留完整路径文本。

排行规则：

- 状态类别层展示当前设备状态下有记录的状态类别。
- 状态原因层展示当前设备状态 + 状态类别下有记录的状态原因。
- 所有层级只展示有记录项，0 值项不进入排行；内容较多时仅排行列表内部滚动，不分页。
- 状态诊断区可固定最大展示高度；面包屑、排行标题和排序控件保持可见，仅排行列表区域内部滚动。
- 排行默认按累计时长排序，支持切换为发生次数排序；排序口径在状态、类别、原因层级共用。
- 切换排序只改变当前排行列表顺序、横向柱条、主指标、次指标和占比列，不改变当前面包屑层级、当前最深选中对象、时间轴高亮和周期汇总表口径。
- 排行行整行可点击，不在行内另放“查看”等操作按钮。
- 排行行 hover 展示名称完整值、累计时长、发生次数、当前排序口径下的占比。

排行字段：

| 排序口径 | 主指标 | 次指标 | 占比列 |
| --- | --- | --- | --- |
| 累计时长 | 累计时长 | 发生次数 | 时长占比 |
| 发生次数 | 发生次数 | 累计时长 | 次数占比 |

下钻和取消规则：

- 启用状态原因分析时，点击 `全部状态` 下的真实设备状态进入 `全部状态 > 设备状态`，展示该状态下的状态类别排行。
- 点击状态类别进入 `全部状态 > 设备状态 > 状态类别`，展示该类别下的状态原因排行。
- 点击状态原因进入 `全部状态 > 设备状态 > 状态类别 > 状态原因`，状态原因排行保持可见，并显示当前状态原因选中态。
- 再次点击当前已选中的状态原因行时，取消状态原因选择，回到状态类别层级。
- 点击面包屑 `全部状态` 时清空状态、类别和原因选择；点击设备状态层级时清空类别和原因；点击状态类别层级时清空原因。
- 未启用状态原因分析时，再次点击已选设备状态行或已选状态卡片，取消状态选择并回到 `全部状态`。
- “其他状态”聚合项不进入面包屑；如需分析被合并的真实设备状态，用户从 `全部状态` 排行中选择对应真实状态。

**状态时间轴**

状态时间轴展示单设备在查询范围内的完整状态流转，不因选择状态、状态类别或状态原因而过滤成局部片段。状态类别和状态原因相关的高亮、hover 和点击命中规则仅在基座启用状态原因分析时适用；未启用状态原因分析时，时间轴只按设备状态展示，hover 和点击定位只到设备状态区间。

| 项目 | 规则 |
| --- | --- |
| 自然日 | 每个自然日一条时间轴，多条自然日共用 `00:00-24:00` 刻度。 |
| 班次日 | 每个班次日一条时间轴，班次在该轴内作为区间标识；同一班次日不按白班 / 夜班拆成多行。 |
| 色块比例 | 状态色块按真实时间长度占比绘制；短时色块可提供最小可点击热区，但不改变统计时长和明细数据。 |
| 图例 | 只展示当前时间轴中实际出现过的真实设备状态，不展示未出现状态，也不展示“其他状态”。 |
| 渲染粒度 | 按底层状态时间明细段渲染相邻小段；启用状态原因分析时，同一设备状态但不同状态类别或状态原因的连续片段不合并为一个大段；未启用状态原因分析时按设备状态区间渲染。 |
| 小段边界 | 相邻同色小段常态不刻意增加分割线；启用状态原因分析时 hover 和点击需命中具体状态类别 / 状态原因明细段；未启用状态原因分析时 hover 和点击命中设备状态区间。 |

布局承载规则：

- 状态时间轴区域保持稳定展示高度，默认最近 7 天查询时应完整展示 7 个自然日或 7 个班次日周期行，不需要区域内纵向滚动。
- 查询 8 到 31 天时，状态时间轴在区域内部纵向滚动展示全部周期行，不与周期汇总表共用滚动区域。
- 时间刻度固定展示在时间轴上方；时间轴内部纵向滚动时，刻度仍保持可见，便于对照各周期的时间位置。

高亮规则：

- 未选中状态时，时间轴按真实设备状态完整着色展示。
- 选中设备状态时，高亮该状态对应区间，其他状态弱化。
- 基座启用状态原因分析且选中状态类别时，高亮该状态类别对应的发生段，其他区间弱化。
- 基座启用状态原因分析且选中状态原因时，高亮该状态原因对应的发生段，其他区间弱化。
- 基座启用状态原因分析时，状态类别 / 状态原因高亮以底层状态时间明细段判断命中，颜色仍沿用所属设备状态颜色。
- 时间轴上方展示当前高亮条件，例如 `当前高亮：停机`、`当前高亮：停机 > 待料`、`当前高亮：停机 > 待料 > 物料未到`；未选状态时可展示为无高亮。

交互规则：

- 状态时间轴区域提供 `状态时间明细` 按钮，打开当前外部分析上下文下的状态时间明细弹窗。
- 基座启用状态原因分析时，时间轴色块 hover 展示设备状态、状态类别、状态原因、开始时间、结束时间、持续时长；未启用状态原因分析时，hover 只展示设备状态、开始时间、结束时间、持续时长。
- 外部已选设备状态、状态类别或状态原因时，仅符合当前高亮条件的色块作为状态时间明细定位入口；未选状态时，全部时间轴色块均可点击定位。
- 时间轴色块支持轻量点击定位：点击某一小段时打开状态时间明细弹窗，弹窗按当前外部分析上下文初始化筛选，并定位到点击命中的第一条明细，当前页轻量高亮。
- 点击时间轴色块不改变外部状态卡片、状态诊断面包屑、时间轴高亮和周期汇总表口径。

**周期汇总表**

周期汇总表用于查看当前分析对象跨周期的趋势，不作为时间段明细入口。状态类别和状态原因两种汇总层级仅在基座启用状态原因分析时出现；未启用状态原因分析时，周期汇总表只存在 `全部状态` 和已选设备状态两种口径。

| 当前分析层级 | 汇总粒度 | 展示字段 |
| --- | --- | --- |
| `全部状态` | 周期 + 设备状态 | 周期、设备状态、累计时长、发生次数、单次平均时长 |
| 已选设备状态 | 周期 + 当前设备状态 | 周期、设备状态、累计时长、发生次数、单次平均时长 |
| 已选状态类别 | 周期 + 当前状态类别 | 仅启用状态原因分析时展示；周期、设备状态、状态类别、累计时长、发生次数、单次平均时长 |
| 已选状态原因 | 周期 + 当前状态原因 | 仅启用状态原因分析时展示；周期、设备状态、状态类别、状态原因、累计时长、发生次数、单次平均时长 |

周期和展示规则：

- 自然日口径下，周期字段表达自然日。
- 班次日口径下，周期字段表达班次日期 + 班次；时间轴按班次日一行展示，周期汇总表按班次维度统计。
- 周期汇总表默认按周期正序展示；不提供额外表头排序。
- 周期汇总表分页展示，分页能力沿用系统标准表格组件。
- 周期汇总表不展示时长占比字段。
- 累计时长和单次平均时长使用系统统一的易读时长格式。
- 发生次数表头提供 tooltip：`跨周期状态时长会按周期拆分，发生次数只计入状态开始所在周期。`
- 未选状态时，只展示当前查询范围内有记录的 `周期 + 设备状态` 行，不按全部真实设备状态补齐 0 值，不展示“其他状态”聚合项。
- 选中某个设备状态后，该设备状态在每个统计周期保留一行；周期内无发生时，累计时长和发生次数为 0，单次平均时长为 `--`。
- 基座启用状态原因分析，且当前分析上下文已经选中某个状态类别或状态原因时，该状态类别或状态原因在每个统计周期保留一行；周期内无发生时按 0 值行展示。
- 周期汇总表行不支持点击打开状态时间明细，避免产生用户不可见的隐藏周期筛选条件。
- 设备状态、状态类别、状态原因等文本字段过长时单行省略，hover 展示完整值；导出时保留完整文本。
- 周期汇总表右上角提供 `导出`，导出当前周期汇总表口径下的全部结果，不只导出当前分页；已选设备状态时需包含设备状态口径下已补齐的 0 值行；启用状态原因分析且已选类别 / 原因时需包含当前口径下已补齐的 0 值行；导出字段与页面当前展示字段一致，未启用状态原因分析时不导出状态类别和状态原因空列。
- 周期汇总表导出需带出上下文信息，包括设备、查询开始日期、查询结束日期、统计口径和当前选择路径；未选状态时当前选择路径为空或不输出。

周期汇总表上方可轻量展示当前选择路径，例如 `当前选择：停机 > 待料`；未选状态时不展示当前选择。

#### 3.4.6 汇总展示设置弹窗

汇总展示设置弹窗用于控制汇总区域的状态展示口径，不维护设备状态主数据。

**入口与弹窗组成**

| 组成部分 | 规则 |
| --- | --- |
| 打开入口 | 设备总览页和单设备分析页右上角均提供 `汇总展示设置` 按钮，打开同一个设置弹窗。 |
| 业务说明 | 状态列表上方展示 `勾选重点状态`、`已选单独展示，未选归入其他状态。` |
| 状态列表 | 展示基座中已有的真实设备状态，页面文本使用状态名称，列表顺序沿用基座设备状态排序。 |
| 展示设置 | 勾选重点状态；已选状态在汇总区域单独展示，未选状态归入“其他状态”。 |
| 操作按钮 | 支持保存和取消；保存后立即对当前页面生效，当前筛选条件不变；取消不保存本次勾选变化。 |

**默认值和设置对象**

- 设置对象为基座中已有的真实设备状态。
- 系统名称为 `运行 / 停机 / 故障` 的固定三态默认勾选为重点状态；用户可取消勾选，取消后归入“其他状态”。
- 用户新增的其他真实状态默认不勾选，并合并到“其他状态”。
- 汇总展示设置不提供状态排序能力；汇总区域中的状态展示顺序按基座设备状态排序展示。
- 未直接展示的真实设备状态自动合并为“其他状态”；“其他状态”只是聚合摘要，不是真实设备状态。

**生效范围**

汇总展示设置只影响以下区域：

- 设备总览的整体状态结构。
- 设备总览的设备汇总表状态列。
- 单设备分析的状态卡片。

汇总展示设置不影响以下区域：

- Top 设备排行的设备状态下拉，仍展示所有真实设备状态，不展示“其他状态”。
- 状态诊断 `全部状态` 排行，仍展示当前设备、当前时间范围内全部有记录的真实设备状态。
- 状态时间轴，仍按真实设备状态展示。
- 周期汇总表，仍按真实设备状态或当前诊断选择展示。
- 状态时间明细仍不受汇总展示设置影响；基座启用状态原因分析时可按真实设备状态、状态类别和状态原因展示，未启用时只按真实设备状态展示。

如果当前已选真实状态被汇总展示设置合并到“其他状态”，不清空当前分析上下文；状态诊断、时间轴、周期汇总表和状态时间明细仍按该真实状态联动。

#### 3.4.7 状态时间明细弹窗

状态时间明细弹窗用于查看当前设备、时间范围和统计口径下的状态区间记录。弹窗内筛选和导出只影响弹窗自身，不反向改变外部页面分析上下文。

**打开入口与默认筛选**

| 打开入口 | 默认筛选 |
| --- | --- |
| 单设备分析页状态时间轴区域点击 `状态时间明细` 按钮 | 继承外部当前最深选中层级；未选状态时展示全部状态时间明细。 |
| 单设备分析页点击时间轴色块 | 继承外部当前最深选中层级，并定位到被点击色块命中的第一条时间段明细；定位只做当前页轻量高亮。 |

当前层级值为 `--` 时，弹窗按空值条件筛选，不按字符串 `--` 做关键词检索。

基座未启用状态原因分析时，外部当前最深选中层级最多到设备状态；弹窗打开后最多继承设备状态筛选，不产生状态类别或状态原因筛选条件。时间轴色块点击定位时，定位到对应设备状态区间明细。

**弹窗组成与规则**

| 组成部分 | 规则 |
| --- | --- |
| 上下文信息 | 顶部展示设备、外部查询开始日期、外部查询结束日期和统计口径。 |
| 合计信息 | 顶部展示当前筛选结果合计，包括时间段数量和累计时长；累计时长使用系统统一的易读时长格式。 |
| 筛选区 | 根据基座是否启用状态原因分析显示不同筛选项，详见下方差异规则。 |
| 表格区 | 展示状态时间明细，固定按开始时间正序展示，分页沿用系统标准表格组件；表格列应在大弹窗内完整阅读，不以横向滚动作为主要阅读方式。 |
| 导出 | 导出弹窗当前筛选条件下的全部时间段明细，不只导出当前分页；导出字段与弹窗当前表格字段一致；空结果也允许导出，文件保留上下文信息、当前筛选条件和表头。 |

状态原因分析开关差异：

| 基座状态原因分析 | 筛选区 | 表格字段 | 关键词范围 | 导出字段 |
| --- | --- | --- | --- | --- |
| 启用 | 展示设备状态、状态类别、状态原因、关键词。状态类别和状态原因按当前设备、时间范围、统计口径下实际出现过的明细值提供下拉筛选。 | 开始时间、结束时间、持续时长、设备状态、状态类别、状态原因。 | 搜索设备状态、状态类别、状态原因等文本字段。 | 与表格字段一致，包含状态类别和状态原因。 |
| 未启用 | 只展示设备状态、关键词；不展示状态类别和状态原因筛选，不展示置灰占位。 | 开始时间、结束时间、持续时长、设备状态。 | 只搜索设备状态文本字段。 | 与表格字段一致，不导出状态类别和状态原因空列。 |

筛选规则：

- 设备状态筛选项来自当前设备、当前时间范围、当前统计口径下实际出现过的时间段明细数据。
- 启用状态原因分析时，状态类别、状态原因筛选项来自当前设备、当前时间范围、当前统计口径下实际出现过的时间段明细数据；空状态类别或空状态原因显示为 `--`，并可作为下拉筛选项。
- 启用状态原因分析时，筛选按 `设备状态 -> 状态类别 -> 状态原因` 级联；选择设备状态后，状态类别只展示该设备状态下出现过的值，状态原因只展示当前设备状态 + 状态类别下出现过的值。
- 启用状态原因分析时，切换上级筛选后，下级筛选中不再匹配的值自动清空；选择状态类别时需同步带入其所属设备状态，选择状态原因时需同步带入其所属设备状态和状态类别，避免出现状态、类别、原因不匹配的筛选组合。
- 未启用状态原因分析时，不展示状态类别和状态原因筛选，也不展示状态类别和状态原因列；页面不以空列、置灰筛选或 `--` 列值表达未启用状态原因分析。
- 关键词只模糊搜索设备状态、状态类别、状态原因等文本字段，不搜索开始时间、结束时间、持续时长等时间或数值字段；关键词不用于检索空值。
- 弹窗内允许用户把筛选条件调整到外部当前分析上下文之外，例如外部当前选择为 `停机 > 待料` 时，弹窗内可切换查看 `故障` 的时间段明细。
- 弹窗内筛选只影响弹窗列表和状态时间明细导出，不反向影响外部时间轴、状态诊断、状态卡片和周期汇总表。
- 关闭弹窗不保存弹窗内筛选状态；下一次打开时重新按打开入口和外部当前分析上下文初始化。

明细表字段：

| 字段 | 规则 |
| --- | --- |
| 开始时间 | 按基座记录时间精度展示；若原始区间跨当前查询边界，按当前查询范围切边后的开始时间展示。 |
| 结束时间 | 按基座记录时间精度展示；若原始区间跨当前查询边界，按当前查询范围切边后的结束时间展示。 |
| 持续时长 | 表格和导出中沿用分钟单位。 |
| 设备状态 | 显示真实设备状态的状态名称。 |
| 状态类别 | 仅基座启用状态原因分析时展示；空值显示 `--`。 |
| 状态原因 | 仅基座启用状态原因分析时展示；空值显示 `--`。 |

设备状态、状态类别、状态原因等文本字段过长时单行省略，hover 展示完整值；导出时保留完整文本。

时间段明细按当前查询范围和统计口径切边展示；若原始状态区间跨越多个统计周期，明细按周期边界拆分展示。弹窗顶部累计时长按已切边、已拆分后的明细持续时长求和。

#### 3.4.8 数据与接口影响

| 数据 / 接口 | 使用位置 | 要求 |
| --- | --- | --- |
| 基座设备清单 | 设备总览设备范围、单设备选择、设备汇总表 | 需返回设备名称和可用于查询状态数据的设备标识。 |
| 基座真实设备状态 | 汇总展示设置、Top 排行状态下拉、状态卡片、状态诊断、时间轴、周期汇总和明细 | 需返回系统名称、状态名称和状态排序；LMES 页面展示、筛选、下钻和导出使用状态名称，汇总展示顺序使用基座状态排序，固定三态识别、初始默认勾选、默认颜色和默认排行状态使用系统名称。 |
| 基座状态原因分析开关 | 状态诊断、状态时间轴、周期汇总表、状态时间明细弹窗 | 关闭时不展示状态类别 / 状态原因相关分析层级、筛选和列。 |
| 基座状态时长原始表 | 全部统计、排行、时间轴、周期汇总和明细 | 需支持按设备、时间范围、设备状态、状态类别、状态原因查询状态区间；LMES 需按查询范围和统计周期切边、拆分和聚合。 |
| 班次配置 | 班次日口径 | 需提供唯一班次日边界和班次顺序；无班次配置时班次日不可用或置灰。 |
| 汇总展示设置 | 总览整体状态结构、设备汇总表、单设备状态卡片 | 需持久化勾选为重点状态的真实设备状态；展示顺序按基座设备状态排序，不在 LMES 汇总展示设置中维护；保存后对当前页面立即生效。 |
| 导出服务 | 图表导出、设备汇总表导出、周期汇总表导出、状态时间明细导出 | 需支持导出当前查询上下文下的完整结果，不受页面滚动区域或当前分页限制。 |

历史状态记录按原始数据查询和计算；基座状态名称变化后的历史展示口径需由研发评审确认。PRD 要求页面按状态名称展示、按系统名称识别固定三态并稳定聚合，不改写历史原始记录。

#### 3.4.9 权限点

| 权限点 | 控制范围 |
| --- | --- |
| 设备状态分析查看 | 进入设备状态分析页面，查看设备总览、单设备分析、状态诊断、状态时间轴、周期汇总表和状态时间明细弹窗。 |
| 汇总展示设置 | 打开、修改和保存汇总展示设置。 |
| 导出 | 执行 `导出图表`、设备汇总表导出、周期汇总表导出和状态时间明细导出。 |

筛选、切换设备、切换统计口径、状态诊断下钻、点击时间轴色块定位不单独设置权限。设备状态分析不新增设备状态维护权限。

#### 3.4.10 异常与边界

| 场景 | 处理规则 |
| --- | --- |
| 未启用状态原因分析 | 状态诊断仍常驻展示 `全部状态` 层状态排行；不进入状态类别 / 状态原因层级；状态时间明细不展示状态类别和状态原因筛选及列；点击状态行或状态卡片只选中设备状态并联动时间轴和周期汇总表。 |
| 无班次配置 | 班次日口径不可用或置灰；自然日口径仍可使用。 |
| 无状态记录设备 | 总览仍展示该设备；不参与 Top 排行；单设备总记录时长为 0 时占比显示 `--`；状态诊断展示 `当前筛选无状态记录`；状态时间明细弹窗显示 `当前筛选无时间段明细`。 |
| 当前选择在新范围无记录 | 保留当前状态诊断面包屑和当前选择，不自动回退；状态诊断展示当前层级对应空态；时间轴仍展示完整时间轴但不出现高亮段；周期汇总表按当前对象补 0；状态时间明细显示空结果。 |
| 状态类别 / 状态原因为空 | 仅基座启用状态原因分析时适用；显示 `--`，作为正常业务值参与排行、点击、面包屑、时间轴高亮、周期汇总表和状态时间明细筛选。 |
| 查询范围超过 31 天 | 阻断查询并提示 `查询范围不能超过 31 天，请缩小日期范围`。 |
| 原始区间跨查询边界或跨周期 | 按当前查询范围切边，并按自然日或班次周期边界拆分；时长按拆分段累计，发生次数只计入原状态区间开始所在周期。 |
| 导出结果为空 | 表格导出仍允许生成空结果文件，保留上下文信息和表头。 |

#### 3.4.11 验收口径

**通用规则验收**

- 设备状态分析只读取基座设备状态和状态时长原始数据，不提供设备状态、状态类别、状态原因或颜色配置维护入口。
- LMES 页面展示、筛选、下钻、hover、弹窗和导出均使用基座状态名称，不展示系统名称；汇总展示设置中固定三态默认勾选且可取消，默认排行和默认颜色按系统名称识别。
- 默认查询最近 7 天；单次查询跨度超过 31 天时阻断；无班次配置时班次日不可用或置灰。

**设备总览页验收**

- 设备状态分析页面默认进入 `设备总览`。
- 设备总览支持开始日期、结束日期、自然日 / 班次日和设备范围筛选。
- 设备范围多选变化后，总览摘要、整体状态结构、Top 设备排行和设备汇总表均按当前设备范围刷新。
- 设备总览页与单设备分析页切换时保留日期范围和统计口径；总览页自身的设备范围、排行状态、排行指标和分页在返回总览时保持不变。
- 整体状态结构按汇总展示设置展示直接展示状态和“其他状态”，并展示状态时长占比和涉及设备数；图表导出包含完整状态摘要。
- Top 设备排行默认按系统名称为 `停机` 的状态累计时长排行，页面展示该状态的基座状态名称；可切换真实设备状态和累计时长 / 发生次数；不展示“其他状态”；无当前状态记录的设备不参与排行；点击设备柱可进入单设备分析并带入当前状态。
- 设备汇总表一行一设备，包含总记录时长和按汇总展示设置生成的状态列；无记录设备也展示；“其他状态”单元格 hover 可看到被合并的真实状态；导出当前筛选范围内全部设备。

**单设备分析页验收**

- 单设备分析页包含顶部筛选区、顶部操作区、状态卡片区、状态诊断、状态时间轴和周期汇总表。
- 单设备分析状态卡片按汇总展示设置展示直接展示状态和“其他状态”汇总卡；“其他状态”不作为诊断入口。
- 单设备状态卡片一行最多 4 个，最终可见卡片数不超过 8 个时完整展示 1 到 2 行；超过 8 个时卡片区内部滚动或收纳，且卡片至少直接展示状态名称、累计时长和时长占比。
- 单设备页直接切换设备时清空当前状态 / 类别 / 原因选择，但保留时间范围、统计口径和状态诊断排序口径；切换时间范围或统计口径时保留当前最深选中层级并重新计算。
- 状态诊断区常驻展示，根层级为 `全部状态`；启用状态原因分析时可下钻到 `全部状态 > 设备状态 > 状态类别 > 状态原因`；未启用时只停留在 `全部状态`。
- 状态诊断排行只展示有记录项，支持累计时长 / 发生次数排序；切换排序不改变当前面包屑、当前选择、时间轴高亮和周期汇总表口径；内容较多时仅排行列表内部滚动，面包屑和排序控件保持可见。
- 状态诊断面包屑最后一层不可点击，上级层级可点击返回；空状态类别或空状态原因在面包屑和排行中显示为 `--`。
- 点击状态卡片或状态诊断排行行后，状态卡片、状态诊断、状态时间轴、周期汇总表和状态时间明细弹窗使用同一当前最深选中层级。
- 状态时间轴按自然日或班次日展示完整状态流转；班次日一行表示一个班次日，班次在该轴内标识；选中设备状态时只高亮命中片段，不过滤时间轴；基座启用状态原因分析时，选中状态类别 / 状态原因也按同样方式高亮命中片段。
- 状态时间轴默认最近 7 天查询时完整展示 7 个周期行；查询 8 到 31 天时在时间轴区域内部纵向滚动，时间刻度保持可见。
- 基座启用状态原因分析时，时间轴按底层状态时间明细段渲染；同色连续小段常态不强制显示边界，但 hover 和点击可命中具体状态类别 / 状态原因明细。
- 基座未启用状态原因分析时，时间轴只按设备状态展示，hover 和点击定位只到设备状态区间，不展示状态类别 / 状态原因字段。
- 点击时间轴色块打开状态时间明细弹窗并定位到命中明细第一条，定位不反向改变外部状态卡片、诊断面包屑、时间轴高亮和周期汇总表。
- 周期汇总表字段随当前层级变化；未选状态时只展示有记录的 `周期 + 设备状态` 行；选中设备状态后每个统计周期保留当前对象一行，周期内无发生时累计时长和发生次数为 0、单次平均时长为 `--`；基座启用状态原因分析时，选中状态类别 / 状态原因也按同样口径展示。
- 基座未启用状态原因分析时，周期汇总表只展示 `全部状态` 和已选设备状态口径，不展示状态类别 / 状态原因列，也不导出状态类别 / 状态原因空列。
- 班次日口径下，状态时间轴按班次日一行展示，周期汇总表按班次维度统计。
- 周期汇总表不展示时长占比，不提供表内筛选、额外表头排序或行点击明细入口；发生次数表头展示跨周期计次 tooltip。

**弹窗验收**

- 汇总展示设置弹窗只影响总览整体状态结构、总览设备汇总表状态列和单设备状态卡片，不影响 Top 排行、状态诊断、时间轴、周期汇总表和状态时间明细。
- 汇总展示设置弹窗只提供状态勾选，不提供状态排序；已选状态单独展示，未选状态归入“其他状态”，展示顺序沿用基座设备状态排序。
- 状态时间明细弹窗展示设备、开始日期、结束日期、统计口径、时间段数量和累计时长。
- 基座启用状态原因分析时，状态时间明细弹窗筛选项包含设备状态、状态类别、状态原因、关键词；表格和导出字段包含开始时间、结束时间、持续时长、设备状态、状态类别、状态原因。
- 基座启用状态原因分析时，状态时间明细弹窗筛选按 `设备状态 -> 状态类别 -> 状态原因` 级联；选择下级筛选时自动带入所属上级筛选，切换上级筛选后不匹配的下级筛选自动清空。
- 基座未启用状态原因分析时，状态时间明细弹窗筛选项只包含设备状态和关键词；表格和导出字段只包含开始时间、结束时间、持续时长、设备状态，不展示状态类别和状态原因筛选、列或导出空列。
- 状态时间明细弹窗内筛选只影响弹窗列表和导出，不反向影响外部页面；弹窗内可临时切换到外部当前分析上下文之外查看；关键词只搜索当前弹窗已展示的文本类状态字段。
- 周期汇总表导出和状态时间明细导出均导出当前口径下全部结果，不只导出当前分页；空结果导出保留上下文、当前筛选条件和表头。

### 3.5 故障统计分析

#### 3.5.1 原始需求

| 需求编号 | 原始需求内容 | 期望结果 |
| --- | --- | --- |
| R-290-007 | 基于标准故障处理记录，新增故障统计分析页面，按报警日期范围统计设备故障次数，并支持查看单设备故障原因和故障处理明细。 | 帮助生产、设备、质量人员定位故障次数最多的设备和主要故障原因，优先处理高频问题。 |

#### 3.5.2 场景、入口和范围

故障统计分析是一个独立分析页面，由实施配置入口接入，不固定写入某个标准菜单分组。页面只查询和统计既有故障处理记录，不提供故障处理、关闭、编辑、原因维护或跳转原记录能力。

使用场景是生产、设备、质量人员在一段报警日期范围内快速看出故障次数最多的设备、主要故障原因，并进一步打开明细定位原始故障处理记录。

页面范围如下：

| 项目 | 说明 |
| --- | --- |
| 页面入口 | 由项目实施按权限配置入口接入；PRD 不固定系统菜单分组。 |
| 页面名称 | `故障统计分析`。 |
| 页面组成 | 同一主页面自上而下包含三块：顶部筛选与全局指标、设备故障次数排行、单设备故障原因分析；第三块中的原因项可打开故障处理明细弹窗。 |
| 操作范围 | 支持查询、同页下钻、返回、查看明细和导出当前统计列表。 |
| 范围边界 | 不提供产品型号筛选、趋势图、班次维度、产线维度、报警级别筛选、处理状态筛选、关键词筛选、实时刷新、故障原因归一化 / 字典化、故障处理明细导出和全量一键导出。 |

#### 3.5.3 术语和统计公共口径

本节只记录跨页面块共用的术语和统计规则。页面标题使用 `故障统计分析`；页面筛选、明细字段中的 `报警时间`、`报警组`、`报警名称`、`报警信息`、`报警级别` 等，均为标准故障处理记录中的原始字段名称，不代表早期参考组件的功能命名口径。

| 项目 | 规则 |
| --- | --- |
| 页面筛选 | 报警日期开始、报警日期结束。页面只显示日期，查询时将开始日期转换为当天 `00:00:00`、结束日期转换为当天 `23:59:59` 后按故障处理记录的 `报警时间` 过滤。 |
| 统计对象 | 标准故障处理记录中 `处理状态不为已关闭` 的数据；`已关闭` 使用故障处理记录既有关闭态枚举值识别。 |
| 不统计数据 | `已关闭` 记录视为已忽略或不需处理的故障，不参与设备排行、故障原因统计、明细弹窗和导出，也不提供包含已关闭记录的筛选开关。 |
| 默认日期 | 页面进入时默认当天日期，系统内部按当天 `00:00:00 - 23:59:59` 统计。 |
| 查询跨度 | 单次查询最大 180 天，超过时阻断查询。 |
| 故障次数 | 一条故障处理记录计为 1 次故障。 |
| 设备分组 | 按故障处理记录页面展示的关联设备口径聚合；设备为空、关联关系失效或无法取得设备名称时，统一归为 `未关联设备`。 |
| 未关联设备 | 作为故障统计分析的虚拟分组参与设备排行、95% 长尾合并和原因分析；不写入设备主数据，不提供设备档案入口。 |
| 故障原因分组 | 按故障处理记录中的 `故障原因` 原始保存文本精确分组。 |
| 故障原因来源 | 故障处理完成时 `故障原因` 为必填；本页面只读取该字段，不补填、不维护。 |
| 文本合并 | 故障原因不按分号、逗号、顿号等标点拆分，不做同义词合并、字典映射或 AI 归一化。 |
| 默认排序 | 设备排行和原因排行均先按故障次数降序；故障次数相同时，按设备名称或故障原因文本升序；`其他` 固定展示在被保留真实项目之后。 |

两层统计均使用帕累托合并规则：

- 先按真实项目故障次数从高到低排序。
- 从第一项开始累计，保留到第一条累计占比超过 95% 的真实项目。
- 第一条累计占比超过 95% 之后的全部真实项目合并为 `其他`。
- 没有后续长尾项目时，不生成 `其他`。
- `其他` 展示在被保留真实项目之后，不因合并后次数重新参与排序。
- `其他` hover 展示被合并的原始项目名称和对应故障次数。
- 累计占比保留 1 位小数。
- 图表、统计列表和导出使用同一套合并后的统计结果。

#### 3.5.4 页面：故障统计分析

故障统计分析是一个单页分析页面，不拆成多个菜单页。页面视觉上按三块理解：第一块是顶部筛选与全局指标，第二块是设备故障次数排行，第三块是单设备故障原因分析。

第一块始终展示。第二块和第三块是同一主内容区的前后两层：页面默认显示第二块；用户在第二块点击某个设备后，同页切换到第三块；用户在第三块点击返回后回到第二块。

**页面结构速览**

| 块位 | 显示时机 | 页面上显示 | 用户可以做什么 | 操作结果 |
| --- | --- | --- | --- |
| 第一块 | 始终显示 | 报警日期开始、报警日期结束、查询按钮、4 个全局指标卡 | 修改日期并查询 | 按当前页面状态刷新统计结果 |
| 第二块 | 默认显示；从第三块返回后显示 | 设备故障次数帕累托图、设备故障次数列表、设备列表导出入口 | 点击真实设备或独立展示的 `未关联设备` | 同页进入第三块 |
| 第三块 | 从第二块点击设备后显示 | 返回入口、当前设备标题、故障原因帕累托图、故障原因列表、原因列表导出入口 | 点击真实故障原因或原因层 `其他` 的查看明细 | 打开故障处理明细弹窗 |

**第一块：顶部筛选与全局指标**

第一块位于页面顶部，包含筛选行和全局指标卡两部分。

| 区域 | 展示内容 | 规则 |
| --- | --- | --- |
| 筛选行 | 报警日期开始、报警日期结束、查询按钮 | 页面只显示日期；开始日期、结束日期必填，开始日期不得晚于结束日期，查询范围不得超过 180 天。 |
| 全局指标卡 | 故障总次数、涉及设备数、故障最多设备、首要故障原因 | 始终按当前报警日期范围的全局数据展示，不随第二块 / 第三块切换而变成单设备口径。 |

页面进入时默认报警日期为当天，并按当天范围自动查询。用户在第一块修改报警日期并查询时：

- 当前停留在第二块时，刷新第二块的设备故障次数排行。
- 当前停留在第三块时，保留当前设备，刷新该设备在新报警日期范围内的故障原因分析。
- 当前设备在新日期范围内无数据时，第三块展示空状态，并保留返回第二块的入口。

指标卡中的设备名称和故障原因过长时单行省略并 hover 展示完整文本。涉及设备数只统计真实设备，不统计 `未关联设备`；故障最多设备可显示 `未关联设备`。

**第二块：设备故障次数排行**

第二块是页面默认主内容，用于回答“当前报警日期范围内哪些设备故障次数最多”。页面进入、查询成功、或从第三块返回时显示第二块。

第二块由两个上下排列的区域组成：

| 区域 | 展示内容 | 操作 |
| --- | --- | --- |
| 设备故障次数帕累托图 | 按设备展示故障次数柱状图和累计占比折线；数据项过多时通过横向滚动或缩放保证可读。 | 点击真实设备或独立展示的 `未关联设备`，同页进入第三块。 |
| 设备故障次数列表 | 列表字段为排名、设备、故障次数、累计占比、操作；右上角提供导出。 | 操作列展示 `查看原因`；点击后同页进入第三块。 |

第二块点击规则：

- 真实设备可以点击，点击后进入第三块，并以该设备作为当前设备。
- `未关联设备` 独立展示时可以点击，点击后进入第三块，并以 `未关联设备` 作为当前设备。
- 设备层 `其他` 是 95% 长尾合并项，不进入第三块；如提供点击反馈，提示 `汇总项不能查看原因`。
- 图表、列表和导出使用同一套合并后的设备统计结果。

**第三块：单设备故障原因分析**

第三块从第二块点击设备后出现，用于回答“当前设备的主要故障原因是什么”。第三块不是独立菜单页，仍使用第一块的报警日期范围和全局指标。

第三块由返回入口和两个上下排列的区域组成：

| 区域 | 展示内容 | 操作 |
| --- | --- | --- |
| 返回入口 / 标题 | 返回入口显示为回到设备故障次数排行；标题显示 `<设备名称> - 故障原因分析`。 | 点击返回入口回到第二块，并保留当前报警日期范围。 |
| 单设备故障原因帕累托图 | 按故障原因展示故障次数柱状图和累计占比折线。 | 图表项可用于查看当前原因统计；明细入口以列表操作为准。 |
| 故障原因列表 | 列表字段为排名、故障原因、故障次数、累计占比、操作；右上角提供导出。 | 操作列展示 `查看明细`；点击后打开故障处理明细弹窗。 |

第三块点击规则：

- 点击真实故障原因的 `查看明细`，打开故障处理明细弹窗，弹窗按当前设备、当前故障原因和当前报警日期范围查询明细。
- 点击原因层 `其他` 的 `查看明细`，也打开故障处理明细弹窗；弹窗顶部当前故障原因显示 `其他`，表格行仍展示原始故障原因文本。
- 原因层 `其他` 不再继续展开内部排行。
- 第三块当前设备在新报警日期范围内无数据时，图表和列表展示空状态，返回入口仍可使用。

**第二块和第三块的关系**

| 用户动作 | 页面结果 | 保留内容 |
| --- | --- | --- |
| 进入页面 | 显示第一块和第二块。 | 默认当天报警日期。 |
| 在第二块点击真实设备 / 独立展示的 `未关联设备` | 同页进入第三块。 | 第一块日期范围和全局指标不变。 |
| 在第二块点击设备层 `其他` | 不进入第三块，提示 `汇总项不能查看原因`。 | 当前第二块保持不变。 |
| 在第三块点击返回入口 | 回到第二块。 | 当前报警日期范围保留。 |
| 在第三块点击真实故障原因 / 原因层 `其他` 的 `查看明细` | 打开故障处理明细弹窗。 | 第三块当前设备和日期范围作为弹窗查询口径。 |
| 在第三块修改日期并查询 | 仍停留第三块，重新计算当前设备的故障原因分析。 | 当前设备保留；如新范围无数据，显示空状态。 |

第二块和第三块共用同一套报警日期范围、已关闭过滤口径、设备归属口径和 95% 长尾合并规则。

#### 3.5.5 弹窗：故障处理明细

故障处理明细弹窗只从第三块打开，第二块不直接打开该弹窗。弹窗为只读大弹窗，用于查看当前设备、当前原因集合、当前报警日期范围下的故障处理记录。

**打开方式**

| 打开入口 | 查询口径 | 弹窗顶部显示 |
| --- | --- | --- |
| 第三块真实故障原因行点击 `查看明细` | 当前设备 + 当前真实故障原因 + 当前报警日期范围 | 当前设备、当前故障原因、当前报警日期范围、当前明细条数 |
| 第三块原因层 `其他` 行点击 `查看明细` | 当前设备 + 被合并到 `其他` 的故障原因集合 + 当前报警日期范围 | 当前设备、故障原因 `其他`、当前报警日期范围、当前明细条数 |

**弹窗组成**

| 区域 | 展示内容 | 规则 |
| --- | --- | --- |
| 顶部信息 | 弹窗标题 `故障处理明细`、当前设备、当前故障原因、当前报警日期范围、当前明细条数、关闭按钮。 | 原因层 `其他` 打开时，顶部故障原因显示 `其他`，表格行保留原始故障原因。 |
| 明细表格 | 报警时间、报警组、报警名称、报警信息、报警级别、类别、处理人、故障原因、处理措施、处理结果。 | 默认按报警时间倒序；按系统标准分页组件展示。 |
| 底部分页 | 上一页、下一页、页码信息。 | 只影响弹窗内明细分页，不改变外部页面。 |

弹窗不展示确认状态、处理状态、确认时间、确认人、关联设备和操作列。弹窗内不支持导出、跳转原记录、编辑、处理或关闭故障。如需按更多条件查询或处理故障，应回到标准故障处理记录页面。故障原因、处理措施、处理结果等长文本可省略展示，hover 展示完整文本。

#### 3.5.6 其他：导出、数据与接口、权限和验收

**导出**

导出只出现在第二块和第三块的列表区域，不放在筛选区，也不出现在故障处理明细弹窗。

| 导出位置 | 导出范围 | 文件格式 | 字段 |
| --- | --- | --- | --- |
| 设备故障次数列表右上角 `导出` | 当前报警日期范围下的设备故障次数统计结果，使用帕累托合并后的列表 | `.xlsx` | 排名、设备、故障次数、累计占比 |
| 故障原因列表右上角 `导出` | 当前设备、当前报警日期范围下的故障原因统计结果，使用帕累托合并后的列表 | `.xlsx` | 排名、故障原因、故障次数、累计占比 |

导出规则：

- 只导出当前统计列表，不导出图表。
- 不导出故障处理明细弹窗。
- 不提供全量一键导出。
- 导出字段与当前列表展示字段一致。
- 导出时保留完整设备名称和完整故障原因文本。
- 当前列表无数据时，导出按钮置灰或不可点击。
- 导出失败时保留当前页面状态，并提示失败原因。
- 导出文件名需区分导出对象，例如 `设备故障次数排行.xlsx`、`单设备故障原因统计.xlsx`。

**数据与接口影响**

| 数据 / 接口 | 使用位置 | 要求 |
| --- | --- | --- |
| 故障处理记录查询 | 设备排行、故障原因统计、明细弹窗、导出 | 需读取报警时间、处理状态、关联设备、故障原因、报警组、报警名称、报警信息、报警级别、类别、处理人、处理措施、处理结果等字段。 |
| 处理状态枚举 | 统计过滤 | 需按标准故障处理记录中表示 `已关闭` 的枚举值过滤；页面不新增处理状态筛选。 |
| 设备关联信息 | 设备故障次数排行、单设备故障原因分析 | 需按故障处理记录页面展示的关联设备口径取得设备名称；为空、无效或无法取得名称时按 `未关联设备` 统计。 |
| 故障原因字段 | 单设备故障原因分析、明细弹窗 | 需读取故障处理记录的 `故障原因` 原始保存文本；不拆分、不归一化、不维护原因字典。 |
| 统计结果接口 | 设备排行、原因分析 | 需返回页面展示所需的故障次数、累计占比、合并后 `其他` 及其被合并明细。 |
| 明细查询接口 | 故障处理明细弹窗 | 需按当前设备、当前原因集合、当前报警日期范围查询明细，并按报警时间倒序分页。 |
| 导出服务 | 设备故障次数列表导出、故障原因列表导出 | 需支持导出当前统计结果为 `.xlsx`，且与页面合并后的列表口径一致。 |

故障统计分析只读取故障处理记录并计算统计结果，不改写故障处理记录，不维护设备主数据，不维护故障原因字典。

**权限点**

| 权限点 | 控制范围 |
| --- | --- |
| 故障统计分析查看 | 进入故障统计分析页面，查询设备故障次数排行、单设备故障原因分析和故障处理明细弹窗。 |
| 故障统计分析导出 | 执行设备故障次数列表导出和故障原因列表导出。 |

查询、下钻、返回、打开明细弹窗不单独设置权限。无导出权限时，页面不展示导出按钮或导出按钮置灰。

**页面验收口径**

- 页面名称为 `故障统计分析`。
- 页面是一个单页分析页面，不拆成多个菜单页；页面包含第一块顶部筛选与全局指标、第二块设备故障次数排行、第三块单设备故障原因分析。
- 第一块始终显示；第二块默认显示；第三块从第二块点击设备后同页显示，并提供返回第二块的入口。
- 页面默认报警日期为当天日期，进入页面后自动按当天范围展示第一块和第二块，统计边界按当天 `00:00:00 - 23:59:59`。
- 查询条件只包含报警日期范围；不展示产品型号、班次、产线、报警级别、处理状态或关键词筛选。
- 未选择完整报警日期、开始日期晚于结束日期、查询范围超过 180 天时，系统阻断查询并提示。
- 统计对象只包含处理状态不为 `已关闭` 的故障处理记录。
- 已关闭故障处理记录不参与设备排行、故障原因统计、明细弹窗和导出。
- 全局指标卡展示故障总次数、涉及设备数、故障最多设备和首要故障原因；进入第三块后仍保持当前报警日期范围的全局口径。
- 涉及设备数只统计真实设备，不统计 `未关联设备`；故障最多设备可显示为 `未关联设备`。
- 指标卡中的设备名称和故障原因过长时省略展示，hover 展示完整文本和次数。
- 第二块包含设备故障次数帕累托图和设备故障次数列表，设备排行按故障次数降序展示，故障次数相同时按设备名称升序展示。
- 第二块列表字段为排名、设备、故障次数、累计占比和操作；真实设备和独立展示的 `未关联设备` 操作为 `查看原因`。
- 第二块的 `未关联设备` 独立展示时可点击查看原因。
- 第二块的 `其他` 不可下钻；hover 可看到被合并设备及各自次数。
- 第二块点击真实设备或独立展示的 `未关联设备` 后，同页进入第三块；点击设备层 `其他` 时不进入第三块，并提示 `汇总项不能查看原因`。
- 第二块的设备故障次数列表不分页；数据较多时列表区域内部滚动；第二块导出只导出当前设备故障次数列表为 `.xlsx`，不导出图表。
- 第三块展示返回入口、当前设备名称、故障原因帕累托图和故障原因列表。
- 第三块点击返回入口后回到第二块，并保留当前报警日期范围。
- 第三块重新查询时，页面不自动返回第二块，仍按当前设备刷新故障原因分析。
- 第三块当前设备在新报警日期范围内无数据时，图表和列表展示空状态。
- 故障原因按原始保存文本精确分组，不按标点拆分，不做同义词或字典合并。
- 第三块原因层 `其他` 可点击查看明细；明细表中的故障原因仍显示原始故障原因文本。
- 第三块故障原因列表不分页；数据较多时列表区域内部滚动；列表导出只导出当前设备的故障原因列表为 `.xlsx`，不导出图表。
- 故障处理明细弹窗只从第三块真实故障原因或原因层 `其他` 的 `查看明细` 打开，第二块不能直接打开明细弹窗。
- 故障处理明细弹窗为大弹窗，顶部展示当前设备、当前故障原因、当前报警日期范围和当前明细条数，表格字段包含报警时间、报警组、报警名称、报警信息、报警级别、类别、处理人、故障原因、处理措施、处理结果。
- 故障处理明细弹窗不包含确认状态、处理状态、确认时间、确认人、关联设备和操作。
- 故障处理明细弹窗按报警时间倒序分页展示。
- 故障处理明细弹窗不支持导出，不支持跳转原记录，不支持处理或编辑。

