> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alforse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 保质期

> 为按序列号和批次跟踪的库存设置到期日期，选择日期的计算方式，并决定过期库存是否仍可发料、调拨或发运。

保质期会在物料的每个批次或每个序列号上标注到期日期，并在使用该库存时强制执行。质量、库存和生产计划人员为每个物料配置一次；操作员则在发料、调拨、拣货和发运时遇到它。

## 概览

到期日期属于实物的**跟踪实体**，而不属于物料本身。因此保质期只适用于按**序列号**和**批次**跟踪的物料：可互换的*库存*和*非库存*物料没有可携带日期的逐单位记录。

三项设置协同工作：

| 设置 | 范围 | 决定的内容 |
| - | - | - |
| 保质期**策略** | 单个物料，位于其拣货方法上 | 每个新批次或序列号如何获得其日期。 |
| **到期日期** | 单个跟踪实体 | 该批次或序列号何时到期。 |
| **过期实体策略** | 整个公司 | 有人使用过期库存时会发生什么。 |

例如，一个采用 **120 天**固定时长策略的物料收到一个批次；该批次在收货过账日期之后 120 天到期。此后，按公司的默认规则，将其发给工单会被拒绝。

## 选择模式

物料的策略只有一种**模式**。`NotManaged` 是默认值：不跟踪有效期，选择它会移除任何已有的策略。其他三种模式各以不同方式计算日期。物料表单以选项卡片的形式显示它们，标签如下。

| 模式（存储值） | 物料表单上的卡片 | 日期的设定方式 | 适用于 |
| - | - | - | - |
| Fixed Duration | **固定保质期** | 一个起始事件**加上天数**。 | 自制或采购物料 |
| Calculated | **从原材料继承** | 制造它所消耗的**组件中最早的有效期**。 | 自制物料 |
| Set on Receipt | **在收货时输入** | 收货时由用户**手动输入**；不做任何计算。 | 采购物料 |

表单会隐藏不适用的模式：自制物料没有可收货的内容，因此不提供*收货时设定*；采购物料不消耗 BOM，因此不提供*计算*。既采购又自制的物料可以看到全部三种。

HEADS UP

**保质期不是单一的“天数”字段**

只有**固定时长**才是天数。*计算*继承其输入中最近的有效期，*收货时设定*则由人工记录供应商打印的日期。把每个物料都当作“收货日期 + N 天”，对三种模式中的两种是错误的。

### 固定时长何时开始计时

起始事件取决于物料的来源方式：

* **采购物料**从**收货的过账日期**开始，而不是从今天开始。
* **自制物料**在**工单工序**完成或开始时起算。您可以将其限制在某一个**触发工艺**（例如*巴氏杀菌*或*包装*），并选择**之前**或**之后**的时机。子装配件按各自的工序为自己的批次标注日期。

### “计算”如何找到最早的输入

**计算**类物料取其所消耗的被跟踪组件中最小的到期日期，因此一次生产的有效期绝不会超过保质期最短的原料。公司的*计算输入范围*决定哪些输入计入：`AllInputs`（默认）使用所有带日期的输入，`ManagedInputsOnly` 只使用自带保质期策略的输入。

如果物料的 BOM 中没有任何输入带有保质期策略，物料表单会警告 **"No BOM input has a shelf-life policy"**（没有 BOM 输入具有保质期策略），因为无法根据 BOM 计算出有效期。

## 设置物料

策略位于物料的**拣货方法**上（即物料在某一位置的设置）。保质期字段只对按序列号和批次跟踪的物料显示。

1. 打开该位置下物料的库存（拣货方法）表单。
2. 开启**保质期**（Shelf-Life）（“跟踪此物料的批次或序列号何时到期。”）。
3. 选择一张模式卡片：**固定保质期**、**从原材料继承**或**在收货时输入**。
4. 对于固定保质期，输入**保质期（天）**。该值由公司的默认保质期天数预填。
5. 对于自制物料，可选择一个**保质期起始工艺**（Shelf Life Start Process）及其**开始到期**（Start Expiration）时机，并按需开启**从BOM计算**。
6. 选择**保存**。

对策略的更改会保存在物料的**保质期历史**（Shelf-Life History）中，可从表单的操作菜单打开。

FieldType

<details>
  <summary>**Mode**</summary>

  *Fixed Duration*、*Calculated* 或 *Set on Receipt*。*（适用于：全部）*
</details>

<details>
  <summary>**Days**</summary>

  加到起始事件上的保质期长度；至少为 1。*（适用于：Fixed Duration）*
</details>

<details>
  <summary>**Trigger process**</summary>

  启动计时的工序；留空表示任意工序。*（适用于：Fixed Duration，自制物料）*
</details>

<details>
  <summary>**Timing**</summary>

  计时是在该工艺**之前**还是**之后**开始：在表单上为*在工序开始时起算有效期*或*在工序结束时起算有效期*。*（适用于：Fixed Duration，自制物料）*
</details>

<details>
  <summary>**Calculate from BOM**</summary>

  同时将日期限定在所消耗组件中最早的有效期之内，使产出绝不会比其原材料更晚过期。当没有任何输入带有效期时，回退到固定时长。*（适用于：Fixed Duration，自制物料）*
</details>

NOTE

**日期只写入一次**

只有当跟踪实体还没有到期日期时，Alforse 才会写入；它从不悄悄覆盖已有的日期。要更改日期，请使用手动覆盖，这需要填写一个**原因**，该原因会保存在实体的历史记录中。

## 公司设置

公司范围的规则位于**设置 → 库存管理**，在**可追溯性**（Traceability）下的**保质期**卡片中：

FieldType

<details>
  <summary>**Warn this many days before expiry**</summary>

  在跟踪实体列表中显示黄色“即将到期”徽章的提前天数。留空则关闭徽章。
</details>

<details>
  <summary>**Default shelf-life duration (days)**</summary>

  当物料设为固定时长时，预填在\*\*保质期（天）\*\*中的值。默认为 7。
</details>

<details>
  <summary>**Calculated finished-good expiry**</summary>

  计算输入范围：**从BOM计算**（`AllInputs`，默认）或**仅子装配件有效期**（`ManagedInputsOnly`）。
</details>

<details>
  <summary>**When expired stock is used**</summary>

  过期实体策略：*警告*、*阻止*或*阻止但可覆盖*（见下文）。
</details>

## 过期库存会怎样

过期实体策略适用于每一次发料和库存调拨：

| 策略 | 设置中的标签 | 库存超过日期时的效果 |
| - | - | - |
| Warn | **警告但允许** | 允许，并附带警告。 |
| Block | **用错误阻止** | 被拒绝；操作员必须选择其他批次或序列号。*（默认）* |
| BlockWithOverride | **阻止，允许覆盖** | 被拒绝，除非用户给出覆盖原因；覆盖需要 `inventory:update` 权限。 |

HEADS UP

**有效期会被强制执行**

在默认的**阻止**策略下，任何消耗或调拨过期批次的尝试都会以 *"Cannot consume expired tracked entit(y/ies)"*（不能消耗已过期的跟踪实体）而终止。Alforse 在每个消耗或移动库存的环节都会检查：发料、库存调拨和维护工作。车间的操作员和办公室的计划员遇到的是同一条规则。

### 拣货顺序与临近到期警告

拣货是**FEFO感知**的：跟踪实体按最早到期优先提供，所以默认情况下最旧的库存最先出库。拣货方法的**拣货单**（Pick Order）可以按物料改为 **FEFO**、**FIFO** 或 **LIFO**；**默认**则先按最近到期、再按最旧排序。

临近日期的批次会在跟踪实体列表中获得临近到期徽章，使用**在到期前多少天发出警告**（Warn this many days before expiry）中设置的提前天数。

## 更正日期

在跟踪实体上使用到期编辑操作（**编辑有效期**）来设置新日期。必须填写原因，并记录在实体的历史中。只有在库库存才接受更正：**已消耗**实体的日期是历史记录，保持原样。

## 各项设置所在位置

| 设置 | 位置 |
| - | - |
| 物料级策略（模式、天数、触发工艺、时机） | 物料的**拣货方法**，位于其保质期字段下。 |
| 过期实体策略、临近到期天数、默认天数、计算输入范围 | **设置 → 库存管理**，**保质期**卡片。 |
| 一次性的日期更正 | 跟踪实体上的到期编辑操作（必须填写原因）。 |

## 故障排查

| 现象 | 原因 | 解决办法 |
| - | - | - |
| 发料或调拨时出现 *"Cannot consume expired tracked entity"* | 策略为**阻止**，且该批次已过期。 | 选择未过期的批次，附原因更正日期，或更改**使用过期库存时**（When expired stock is used）。 |
| *"Cannot post shipment with expired batch"*（不能用过期批次过账发运） | 发运行分配了过期批次。 | 分配其他批次、修正日期，或将规则放宽为警告。 |
| 拣货方法上缺少保质期字段 | 该物料不是按序列号或批次跟踪。 | 如果它应当过期，请更改物料的跟踪类型。 |
| *"No BOM input has a shelf-life policy"* | 采用计算模式（或从 BOM 计算）但没有带日期的输入。 | 为组件设置保质期策略，或使用不带 BOM 上限的固定时长。 |

## 相关内容

**可追溯性**

跟踪带日期的批次或序列号，贯穿收货、工单和发运。

[Open](https://docs.alforse.com/zh/docs/reference/traceability.md)

**库存管理**

库存所在位置，以及其移动如何被记录。

[Open](https://docs.alforse.com/zh/docs/reference/inventory.md)

**物料**

设置使物料适用保质期的跟踪类型。

[Open](https://docs.alforse.com/zh/docs/reference/items.md)

**存储规则**

用规则而不是日期来管控库存移动。

[Open](https://docs.alforse.com/zh/docs/reference/storage-rules.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.