certflow.services.dn_service module

公称通径(DN)处理服务

对标 VBA function.vb 确认口径() 函数,提供: 1. 口径字符串标准化(去除 DN 前缀、英制转换) 2. 口径映射查询(从 SQLite caliber_mappings 表) 3. 自学习机制(新口径自动记录到数据库) 4. 多口径处理(如 DN100*80 → 100*80)

v2.0 新增:
  • 对标 VBA 确认口径() 全部逻辑

  • 英制口径识别(2", 2-1/2" 等格式)

  • 哨兵值处理(VBA 的 CInt(-20) 对应 None)

class certflow.services.dn_service.DNService(session=None)[源代码]

基类:object

公称通径处理服务

负责从口径字符串解析/查询标准化口径值。

对标 VBA function.vb 确认口径() 函数(第156-293行)。

参数:

session (Session | None)

session

SQLAlchemy 数据库会话

static normalize_caliber(raw_text)[源代码]

标准化口径字符串

对标 VBA print.vb 第681行: .Cells(5, 2) = Replace(str_kjA, "DN", "")

参数:

raw_text (str) -- 原始口径字符串,如 "DN100", "DN100*80", "2""

返回:

标准化口径值,如 "100", "100*80", "50"

返回类型:

str

static is_imperial_caliber(raw_text)[源代码]

判断是否为英制口径

参数:

raw_text (str) -- 口径字符串

返回:

是否英制

返回类型:

bool

static is_imperial_model(model)[源代码]

判断产品型号是否为英制(含 LB 磅级或 2500 等级)

对标 VBA 确认压力() 第312行: If (UCase(... Like "LB") Or (UCase(... Like "2500")) Then ...

参数:

model (str) -- 产品型号字符串

返回:

是否英制型号

返回类型:

bool

static imperial_to_mm(inch_str)[源代码]

英制口径转换为 mm 值

对标 VBA 确认口径() 中隐含的英制转换逻辑。 常见英制口径对照: - 1/2" → 15mm - 3/4" → 20mm - 1" → 25mm - 1-1/4" → 32mm - 1-1/2" → 40mm - 2" → 50mm - 2-1/2" → 65mm - 3" → 80mm - 4" → 100mm - 5" → 125mm - 6" → 150mm - 8" → 200mm - 10" → 250mm - 12" → 300mm

参数:

inch_str (str) -- 英制口径字符串,如 "2"", "2-1/2""

返回:

mm 值字符串,如 "50", "65",未匹配返回 None

返回类型:

str

lookup_caliber_from_db(raw_text)[源代码]

从 caliber_mappings 表查询口径映射

对标 VBA 确认口径() 第164-166行: Arr_KouJingDuiYing = CanShuSheet.Range("口径替换数据表")

参数:

raw_text (str) -- 原始口径字符串

返回:

{caliber_value, is_imperial} 或 None

返回类型:

dict

resolve_caliber(caliber_str, model='', fallback_raw='')[源代码]

解析口径字符串,返回标准化口径信息

处理流程对标 VBA 确认口径() 函数(含 B5/C5 回退与英制 LB 判断): 1. 英制口径判断和转换(支持携带 LB 磅级,如 2"150LB) 2. 数据库口径映射表查询(剥离 LB 后缀后匹配) 3. 直接标准化(去除 DN 前缀、清理 "MM" 后缀) 4. C5/C6 备用口径回退(主口径为空或解析无效时启用) 5. 无法解析,标记 needs_manual

参数:
  • caliber_str (str) -- 原始口径字符串,如 "DN100", "2"", "DN100*80", "2"150LB"

  • model (str) -- 产品型号(用于自学习关联及英制型号判断)

  • fallback_raw (str) -- 备用口径原始串(C5/C6 备用列),主口径为空或解析失败时回退

返回:

包含以下键的字典

  • caliber_value (str): 标准化口径值,如 "100", "50"

  • is_imperial (bool): 是否英制

  • raw_text (str): 原始文本

  • source (str): 来源 "db" / "imperial" / "normalize" / "fallback" / "unknown"

  • needs_manual (bool): 是否需要手动补充(对标 VBA CInt(-20) 哨兵)

  • lb_class (str | None): 提取到的 LB 磅级(如 "150"),无则 None

返回类型:

dict

auto_learn(raw_text, caliber_value, is_imperial=False, certificate_no='')[源代码]

自动记录新口径到 caliber_mappings 表

对标 VBA 确认口径() 第263-283行的自动追加行为: Arr_KouJingDuiYing(UBound(...), 1) = 口径字符串 Arr_KouJingDuiYing(UBound(...), 2) = 确认口径

参数:
  • raw_text (str) -- 原始口径字符串

  • caliber_value (str) -- 标准化口径值

  • is_imperial (bool) -- 是否英制

  • certificate_no (str) -- 关联合格证编号

返回:

是否成功

返回类型:

bool