certflow.services.cert_numbering_policy module¶
合格证编号策略(配置驱动)——步骤 6:编号时机与编码模式。
对应蓝图 §4.4:把「编号时机」与「编码模式判定」从硬编码抽到 config.yaml:
certificate.numbering.timing:``on_demand``(默认,查询页手动触发) / ``on_import``(写入 Certificate 时对未编号记录自动编号)。certificate.numbering.modes:按when_field的关键词匹配 →number_model, 替代原先硬编码的number_model = 0``(复用 ``printer.numbering_modes数值)。certificate.numbering.range_regex:范围编码解析正则(如V2603121XL---125XL→ 起止流水),供逐台展开 / 校验。
本模块的核心判定函数为**纯函数**(resolve_number_model / parse_number_range),
不依赖配置加载与 Qt,可独立单测;get_* 系列为读取配置的薄封装。
设计原则(与总原则一致):默认配置保持现状语义——timing 默认 on_demand、
modes 默认为空(一律回退 default_mode=0),即与既有行为零差异;
启用只需改 YAML,无需改代码。
- certflow.services.cert_numbering_policy.resolve_number_model(record, modes, default=0)[源代码]¶
按配置的编码模式规则判定 ``number_model``(纯函数)。
规则按顺序匹配:某规则的
when_field``(或兼容键 ``field)对应字段值包含keywords中任一关键词时,返回该规则的mode;全部未命中返回default。
- certflow.services.cert_numbering_policy.resolve_sn_kks_position(record, modes, default='')[源代码]¶
按配置的编码模式规则判定双编码位置约定(纯函数,对齐 VBA ar(2,8))。
与
resolve_number_model共用命中规则:某规则的when_field对应字段值 含keywords中任一关键词时,返回该规则的sn_kks_position;全部未命中 返回 ``default``(空串=默认不互换)。
- certflow.services.cert_numbering_policy.parse_number_range(code, regex=None)[源代码]¶
解析范围编码的起止流水(纯函数)。
如
V2603121XL---125XL→(121, 125)、V2604520Y-524Y→(520, 524); 非范围编码返回None。
- certflow.services.cert_numbering_policy.get_military_prefix()[源代码]¶
读取军工模式前缀(mode:7,无 V+YYMM 的军工前缀,如 "JG")。
默认 "JG";军工三位流水模式自动编号时用此前缀 + 三位流水。
- 返回类型:
- certflow.services.cert_numbering_policy.parse_military_code_meta(code)[源代码]¶
解析军工三位流水区间串(mode:7,无 V+YYMM 前缀)。
如
JG001A-JG100A→ ``{"prefix": "JG", "seq_start": 1, "seq_end": 100, "suffix": "A","quantity": 100}``;单台
JG001A→ seq_end==seq_start。军工码特征:前缀非
V且其后直接是 3 位以上流水(无 4 位年月), 与标准V{YYMM}{流水}区分。供 G2 逐台展开写入 Certificate。
- certflow.services.cert_numbering_policy.parse_product_code_meta(code)[源代码]¶
解析产品编号区间串的元信息(前缀/年月/起止流水/台数)。
如
V2604520Y---524Y→ ``{"prefix": "V", "ym": "2604", "seq_start": 520, "seq_end": 524,"suffix": "Y", "quantity": 5}``;单台
V2604520Y→ seq_end==seq_start。供 G2 在
create_certificates中将区间串拆填入Certificate.product_code_range/product_code_prefix/product_code_ym/product_code_seq_start/product_code_seq_end/ ``quantity``(本批台数 = seq_end - seq_start + 1)。
- certflow.services.cert_numbering_policy.get_numbering_timing()[源代码]¶
读取编号时机:
on_demand``(默认)或 ``on_import。- 返回类型:
- certflow.services.cert_numbering_policy.get_issue_date_source()[源代码]¶
读取出厂日期年月来源(BUG-006 J,配置驱动)。
sync_numbering_ym``(默认):出厂日期年月同步产品编号年月 (``product_code_ym,如V2607…→2026.07)。current_ym:出厂日期取当前年月(datetime.now())。
- certflow.services.cert_numbering_policy.get_number_model(record)[源代码]¶
按
certificate.numbering.modes判定记录的number_model。默认(modes 为空)回退
certificate.numbering.default_mode``(默认 0), 与既有硬编码 ``number_model = 0行为一致。
- certflow.services.cert_numbering_policy.get_sn_kks_position(record)[源代码]¶
按
certificate.numbering.modes判定记录的sn_kks_position。默认(modes 为空)回退空串(默认不互换)。与
get_number_model共用命中 规则,使双编码位置约定随客户/关键词一并确定(对齐 VBA ar(2,8))。
- certflow.services.cert_numbering_policy.get_range_regex()[源代码]¶
读取范围编码解析正则(未配置返回
None→ 用内置默认)。- 返回类型:
str | None
- certflow.services.cert_numbering_policy.is_auto_calc_dn_pn()[源代码]¶
自动计算口径压力开关(§5.7.2-E / 维度8,对齐 VBA G11)。
默认 True(现状:打印前自动从型号解析口径/压力并预填);
certificate.numbering.auto_calc_dn_pn: false时关闭自动推算, 仅用已存值、不就口径/压力缺失弹补充对话框。- 返回:
是否启用自动计算口径压力。
- 返回类型:
- certflow.services.cert_numbering_policy.is_yellow_skip_enabled()[源代码]¶
读取是否按源表黄底(65535)跳过编号(默认 False)。
- 返回类型: