返回技能列表

implement-pharma-serialisation

pjt222
更新于 2 days ago
4 次查看
17
2
17
在 GitHub 上查看
其他general

关于

This skill helps developers implement pharmaceutical serialization and traceability systems compliant with global regulations like EU FMD and US DSCSA. It covers generating unique identifiers, managing aggregation hierarchies, exchanging EPCIS data, and integrating verification endpoints. Use it when launching new products, integrating with national verification systems, designing compliant data exchanges, or expanding serialization to other markets.

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/implement-pharma-serialisation

在 Claude Code 中复制并粘贴此命令以安装该技能

技能文档


name: implement-pharma-serialisation description: > 实施符合 EU FMD、US DSCSA 及其他全球法规的药品序列化和追溯系统。 涵盖唯一标识符生成、聚合层级、EPCIS 数据交换和验证终端集成。 适用于新产品上市序列化实施、与 EMVS/NMVS 集成、设计 DSCSA 合规 交易交换、构建 EPCIS 事件库,或将序列化扩展到其他市场 (中国、巴西、俄罗斯)时使用。 locale: zh-CN source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: compliance complexity: advanced language: multi tags: serialisation, eu-fmd, dscsa, epcis, track-and-trace, pharma

实施药品序列化

为符合全球追溯法规要求搭建药品序列化系统。

适用场景

  • 为在欧盟或美国市场的新产品上市实施序列化
  • 与欧洲药品验证系统(EMVS/NMVS)集成
  • 设计 DSCSA 合规的交易信息交换
  • 构建或集成 EPCIS 事件库以实现供应链可视化
  • 将序列化扩展到其他市场(中国 NMPA、巴西 ANVISA 等)

输入

  • 必填:产品信息(GTIN、产品代码、剂型、包装规格)
  • 必填:目标市场法规(EU FMD、DSCSA 或两者均适用)
  • 必填:包装层级(单件、捆包、箱、托盘)
  • 可选:用于集成的现有 ERP/MES 系统详情
  • 可选:合同制造商的序列化能力
  • 可选:验证终端规范

步骤

第 1 步:了解法规全貌

法规地区关键要求截止日期
EU FMD (2011/62/EU)欧盟/欧洲经济区每个单位包含唯一标识符及防篡改特征2019年2月起生效
DSCSA美国包装级电子化、可互操作追溯2024年11月起全面执行
中国 NMPA中国每最小销售单位的唯一药品追溯码滚动推进
巴西 ANVISA (SNCM)巴西带 IUM 的药品序列化滚动推进
俄罗斯 MDLP俄罗斯每单位密码码,强制扫描已生效

各法规关键数据要素:

EU FMD 唯一标识符(依据授权法规 2016/161):

  • 产品代码(GS1 GTIN-14)
  • 序列号(最多 20 位字母数字字符,随机生成)
  • 批次/批号
  • 有效期

DSCSA 交易信息:

  • 产品标识符(NDC/GTIN、序列号、批次、有效期)
  • 交易信息(日期、实体、发货详情)
  • 交易历史和交易声明
  • 包装级验证

预期结果: 清晰了解适用于每个产品-市场组合的法规。 失败处理: 在继续前与监管事务部门确认市场要求。

第 2 步:设计序列化数据模型

-- 核心序列化数据模型
CREATE TABLE serial_numbers (
    id BIGSERIAL PRIMARY KEY,
    gtin VARCHAR(14) NOT NULL,          -- GS1 GTIN-14
    serial_number VARCHAR(20) NOT NULL,  -- 每个 GTIN 唯一
    batch_lot VARCHAR(20) NOT NULL,
    expiry_date DATE NOT NULL,
    status VARCHAR(20) DEFAULT 'ACTIVE', -- ACTIVE, DECOMMISSIONED, DISPENSED 等
    created_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(gtin, serial_number)
);

-- 聚合层级
CREATE TABLE aggregation (
    id BIGSERIAL PRIMARY KEY,
    parent_code VARCHAR(50) NOT NULL,     -- SSCC 或更高级别代码
    parent_level VARCHAR(10) NOT NULL,    -- CASE, PALLET, BUNDLE
    child_code VARCHAR(50) NOT NULL,      -- GTIN+序列号或子 SSCC
    child_level VARCHAR(10) NOT NULL,     -- UNIT, BUNDLE, CASE
    aggregation_event_id UUID NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- EPCIS 事件
CREATE TABLE epcis_events (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    event_type VARCHAR(30) NOT NULL,      -- ObjectEvent, AggregationEvent, TransactionEvent
    action VARCHAR(10) NOT NULL,          -- ADD, OBSERVE, DELETE
    biz_step VARCHAR(100),               -- urn:epcglobal:cbv:bizstep:commissioning
    disposition VARCHAR(100),             -- urn:epcglobal:cbv:disp:active
    read_point VARCHAR(100),             -- urn:epc:id:sgln:location
    event_time TIMESTAMPTZ NOT NULL,
    event_timezone VARCHAR(6) NOT NULL,
    payload JSONB NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

聚合层级:

托盘(SSCC)
  └── 箱(SSCC)
       └── 捆包(GTIN + 序列号)[可选层级]
            └── 单件(GTIN + 序列号)

预期结果: 数据模型支持完整包装层级和 EPCIS 事件追踪。 失败处理: 若现有 ERP 架构存在冲突,设计集成层而非直接修改 ERP。

第 3 步:实施序列号生成

import secrets
import string

def generate_serial_number(length: int = 20, charset: str = None) -> str:
    """生成符合 GS1 标准的随机序列号。

    EU FMD 要求随机序列号以防止预测。
    最多 20 个字符,字母数字(GS1 应用标识符 21)。
    """
    if charset is None:
        # GS1 AI(21) 允许:数字、大写字母、小写字母及部分特殊字符
        # 大多数实现仅使用字母数字以确保互操作性
        charset = string.ascii_uppercase + string.digits
    return ''.join(secrets.choice(charset) for _ in range(length))


def generate_serial_batch(gtin: str, batch_lot: str, expiry: str, count: int) -> list:
    """为生产运行生成一批唯一序列号。"""
    serials = set()
    while len(serials) < count:
        serials.add(generate_serial_number())
    return [
        {
            "gtin": gtin,
            "serial_number": sn,
            "batch_lot": batch_lot,
            "expiry_date": expiry,
            "status": "COMMISSIONED"
        }
        for sn in serials
    ]

预期结果: 序列号是密码学随机的,每个 GTIN 唯一,并在打印前存储。 失败处理: 若出现唯一性冲突,重新生成冲突序列号并记录该事件。

第 4 步:实施 GS1 DataMatrix 编码

二维 DataMatrix 条码编码 GS1 元素字符串:

(01)GTIN(21)序列号(10)批次(17)有效期

示例:

(01)05012345678901(21)A1B2C3D4E5(10)LOT123(17)261231

其中:

  • AI(01) = GTIN-14
  • AI(21) = 序列号
  • AI(10) = 批次/批号
  • AI(17) = 有效期(YYMMDD)

GS1 DataMatrix 使用 FNC1 作为分隔符(GS 字符,ASCII 29)来分隔可变长度字段。

def encode_gs1_element_string(gtin: str, serial: str, batch: str, expiry: str) -> str:
    """为 DataMatrix 打印编码 GS1 元素字符串。

    FNC1(GS 字符 \\x1d)分隔可变长度字段。
    AI(01) 和 AI(17) 为固定长度,其后无需分隔符。
    AI(21) 和 AI(10) 为可变长度,需要 FNC1 终止符。
    """
    GS = '\x1d'  # GS1 FNC1 / 组分隔符
    return f"01{gtin}21{serial}{GS}10{batch}{GS}17{expiry}"

预期结果: 编码字符串通过 GS1 认证验证器(ISO 15415 C 级或以上)扫描测试打印件验证。 失败处理: 若扫描验证失败,检查打印质量、静区和编码顺序。

第 5 步:与国家验证系统集成

EU FMD — EMVS/NMVS 集成

MAH → 上传序列数据 → EU Hub → 分发到国家系统(NMVS)
                                ├── 德国(securPharm)
                                ├── 法国(CTS)
                                ├── 意大利(AIFA)
                                └── ... 31 个市场

API 操作:

  1. 上传(MAH → EU Hub):批量上传已委托序列号
  2. 验证(药房 → NMVS):在配发前检查序列状态
  3. 注销(药房 → NMVS):在销售点标记为已配发
  4. 重新激活(MAH → NMVS):撤销意外注销

DSCSA — 验证路由器服务

贸易伙伴 A → VRS 请求 → 验证路由器 → MAH 的 VRS → 响应

实施 VRS 响应端点:

# 简化的 VRS 端点(DSCSA 验证)
from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/verify/{gtin}/{serial}/{lot}/{expiry}")
async def verify_product(gtin: str, serial: str, lot: str, expiry: str):
    """DSCSA 产品验证端点。"""
    record = await lookup_serial(gtin, serial)
    if record is None:
        return {"verified": False, "reason": "SERIAL_NOT_FOUND"}
    if record.batch_lot != lot or str(record.expiry_date) != expiry:
        return {"verified": False, "reason": "DATA_MISMATCH"}
    if record.status != "ACTIVE":
        return {"verified": False, "reason": f"STATUS_{record.status}"}
    return {"verified": True, "status": record.status}

预期结果: 验证端点在 1 秒内以正确状态响应。 失败处理: 若国家系统上传失败,使用指数退避重试并通知运营团队。

第 6 步:实施 EPCIS 事件捕获

以 EPCIS 2.0 格式记录供应链事件:

{
  "@context": "https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld",
  "type": "ObjectEvent",
  "eventTime": "2025-03-15T10:30:00.000+01:00",
  "eventTimeZoneOffset": "+01:00",
  "epcList": ["urn:epc:id:sgtin:5012345.067890.A1B2C3D4E5"],
  "action": "ADD",
  "bizStep": "urn:epcglobal:cbv:bizstep:commissioning",
  "disposition": "urn:epcglobal:cbv:disp:active",
  "readPoint": {"id": "urn:epc:id:sgln:5012345.00001.0"},
  "bizLocation": {"id": "urn:epc:id:sgln:5012345.00001.0"}
}

药品供应链中的关键业务步骤:

  • commissioning — 序列号分配给实物单位
  • packing — 聚合到箱/托盘
  • shipping — 从某地点发出
  • receiving — 到达某地点
  • dispensing — 配发给患者(注销触发点)

预期结果: 每次状态变更均生成带正确时间戳和地点的 EPCIS 事件。 失败处理: 事件捕获失败必须排队重试;绝不能静默丢弃。

验证清单

  • 序列号已随机化,每个 GTIN 唯一
  • GS1 DataMatrix 编码经条码扫描仪验证(ISO 15415 C 级或以上)
  • 聚合层级正确链接单件→捆包→箱→托盘
  • 国家验证系统集成已测试(上传、验证、注销)
  • 所有业务步骤均已捕获 EPCIS 事件
  • 验证端点在 1 秒内响应
  • 异常处理涵盖上传失败、扫描失败和网络错误

常见问题

  • 顺序序列号:EU FMD 明确要求随机化以防止仿冒,绝不使用顺序编号
  • 聚合错误:拆箱(打开箱子)必须更新层级关系,运送带错误子关联的箱子会导致下游验证失败
  • 时区处理:EPCIS 事件必须包含时区偏移,使用不带偏移的本地时间会在跨站点时造成事件排序歧义
  • 上传延迟:序列数据必须在产品进入供应链之前上传到国家系统,延迟上传=产品在药房被标记为可疑
  • 忽视异常:合法产品定期会产生错误警报,建立调查和解决警报的流程至关重要

相关技能

  • perform-csv-assessment — 将序列化系统作为计算机化系统进行验证
  • conduct-gxp-audit — 审计序列化流程
  • implement-audit-trail — 序列化事件的审计追踪
  • serialize-data-formats — 通用数据序列化(不同领域,互补概念)
  • design-serialization-schema — 数据交换格式的架构设计

GitHub 仓库

pjt222/agent-almanac
路径: i18n/zh-CN/skills/implement-pharma-serialisation
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

llamaguard

其他

LlamaGuard是Meta推出的7-8B参数内容审核模型,专门用于过滤LLM的输入和输出内容。它能检测六大安全风险类别(暴力/仇恨、性内容、武器、违禁品、自残、犯罪计划),准确率达94-95%。开发者可通过HuggingFace、vLLM或Sagemaker快速部署,并能与NeMo Guardrails集成实现自动化安全防护。

查看技能

cost-optimization

其他

这个Claude Skill帮助开发者优化云成本,通过资源调整、标记策略和预留实例来降低AWS、Azure和GCP的开支。它适用于减少云支出、分析基础设施成本或实施成本治理策略的场景。关键功能包括提供成本可视化、资源规模调整指导和定价模型优化建议。

查看技能

quantizing-models-bitsandbytes

其他

这个Skill使用bitsandbytes库量化大语言模型,能在GPU内存有限时通过8位或4位量化减少50-75%内存占用,同时保持精度损失最小。它支持INT8、NF4、FP4等多种量化格式,可与HuggingFace Transformers无缝集成,适用于需要部署更大模型或加速推理的场景。还提供QLoRA训练和8位优化器支持,让开发者能轻松实现高效模型压缩。

查看技能

dispatching-parallel-agents

其他

该Skill用于并行处理3个以上无依赖关系的独立故障,可为每个问题域分派专属Claude代理同时执行调查修复。它通过并发处理多个独立问题显著提升故障排查效率,特别适用于测试文件、子系统等无共享状态的场景。

查看技能