certflow.services.pn_service module

公称压力(PN)处理服务

对标 VBA function.vb 确认压力() 函数,提供: 1. 型号→压力对照查询(从 SQLite model_param_mappings 表) 2. 英制(LB)/公制(MPa)自动判断 3. 单位剥离和标准化 4. 不同模板类型的显示文本生成 5. 自学习机制(新型号自动记录到数据库)

v2.0 新增:
  • 支持三种模板类型(全中文/中英文/俄英文)的 PN 显示格式

  • 全中文模板:纯数值(底图已印 MPa),英制带 Lb

  • 中英文/俄英文模板:数值+单位(底图可能无单位印刷)

class certflow.services.pn_service.PNService(session=None)[源代码]

基类:object

公称压力处理服务

负责从产品型号解析/查询公称压力,提供统一的压力值表示。

对标 VBA function.vb 确认压力() 函数(第295-399行)。

参数:

session (Session | None)

session

SQLAlchemy 数据库会话

static is_imperial(model)[源代码]

判断型号是否为英制压力

对标 VBA print.vb 第634行:

If (UCase(.Cells(iR, 14+OfSet)) Like "*LB*") Or
   (UCase(.Cells(iR, 14+OfSet)) Like "*2500*") Then
参数:

model (str) -- 产品型号字符串,如 "Z41H-150LB"

返回:

是否英制

返回类型:

bool

static extract_lb_level(model)[源代码]

从型号中提取 LB 等级

对标 VBA print.vb 第644-648行: If Cells(iR, 14+OfSet) Like "300LB" Then v1 = 300 If Cells(iR, 14+OfSet) Like "150LB" Then v1 = 150 ...

参数:

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

返回:

LB 等级值,如 150/300/600/800/900/1500/2500,未匹配返回 None

返回类型:

int

static lb_to_mpa(lb_level)[源代码]

英制 LB 等级转换为公制 MPa 压力值

对标 VBA 确认压力() 第312-315行: If 压力返回值 = "150Lb" Then 压力返回值 = 2# If 压力返回值 = "300Lb" Then 压力返回值 = 5# If 压力返回值 = "600Lb" Then 压力返回值 = 10# If 压力返回值 = "800Lb" Then 压力返回值 = 13#

#30 P0 DN/PN 字典 DB 化:换算表 yaml 化(config.yaml 的 sales_plan.pn_convert.lb_to_mpa),配置优先;内置 LB_TO_MPA_MAP 作为回退(配置缺失时仍可用,不阻断打印)。

参数:

lb_level (int) -- LB 等级值

返回:

对应 MPa 压力值

返回类型:

float

static strip_unit(pressure_str)[源代码]

剥离压力字符串中的单位后缀

对标 VBA 确认压力() 第316行:

If 压力返回值 Like "*MPa" Then
    压力返回值 = VBA.Replace(UCase(压力返回值), UCase("MPa"), "")
参数:

pressure_str (str) -- 带可能的单位后缀的压力字符串,如 "2.5MPa", "150Lb", "1.0"

返回:

(数值部分, 单位) 元组,如 ("2.5", "MPa"), ("150", "Lb"), ("1.0", "")

返回类型:

tuple[str, str]

static normalize_pn_value(pressure_str)[源代码]

标准化压力数值(去除单位,返回纯数值字符串)

参数:

pressure_str (str) -- 压力字符串

返回:

纯数值字符串,如 "2.5", "150"

返回类型:

str

static derive_pn_fields(pn_raw, family)[源代码]

``pn_display``(权威输入串,任意格式)反向拆出存储三件套。

单一真相来源(docs/PATCH_LOG 补丁 29/30/32):合格证压力只用 pn_display 落库,pn_value / pn_unit 由其反向拆出,渲染再按模板语言族决定带不带单位 (见 TemplateFieldFormatter.format_pn / output_guard.validate_pn_text)。

规则: - pn_display 始终保存**完整串**(含单位),如 "25.0MPa" / "150Lb"; - 中文数值型(无单位)→ 默认补 MPa``(底板预印 MPa),即 ``"25.0"

("25.0MPa", "25.0", "MPa")

  • 非中文数值型被门限拦截,不会传入此处;带单位(如 "150Lb")正常拆;

  • 非 MPa 单位(如 Lb/KPa)原样保留,不做换算。

参数:
  • pn_raw (str) -- 用户输入/字典原文(如 "25.0" / "32.0MPa" / "150Lb")。

  • family (str) -- 模板语言族(全中文/中英文/全英文/俄英文)。

返回:

(pn_display, pn_value, pn_unit) 三元组。

返回类型:

tuple[str, str, str]

lookup_pn_from_db(model)[源代码]

从 model_param_mappings 表查询型号对应的压力信息

注意:此方法依赖 model_param_mappings 表已存在。 如果表尚未创建,返回 None。

参数:

model (str) -- 产品型号

返回:

{pressure_value, test_standard, working_temp, working_medium} 或 None

返回类型:

dict

resolve_pn(model, template_pn=None)[源代码]

从型号解析公称压力,返回完整的 PN 信息字典

处理流程: 1. 判断是否英制型号(LB)→ 提取磅级并转 MPa 2. 否则优先用 ModelSpecParser 稳健解析型号内嵌压力(白名单,识别

PNxx/CLASSxx/标准压力代号,避免末尾温度/材质数字误判)

  1. 否则回退既有逻辑:数据库 model_param_mappings → 模板 PN → 型号后缀脆弱兜底提取

  2. 剥离单位后缀、返回标准化结果

参数:
  • model (str) -- 产品型号,如 "Z41H-25C", "Z41H-150LB"

  • template_pn (str | None) -- 模板中已有的 PN 值(可选),如 "2.5MPa"

返回:

包含以下键的字典

  • pn_value (str): 纯数值,如 "2.5", "150"

  • pn_display (str): 带单位显示,如 "2.5MPa", "150Lb"

  • pn_unit (str): 单位 "MPa" / "Lb" / ""

  • is_imperial (bool): 是否英制

  • lb_level (int | None): LB 等级(仅英制)

  • mpa_equiv (float | None): 等效 MPa(仅英制)

  • source (str): 来源 "model" / "template" / "db" / "unknown"

返回类型:

dict

static get_display_text(pn_value, pn_unit, template_type='全中文')[源代码]

根据模板类型生成适合打印的 PN 显示文本

对标 VBA print.vb 中三种模板的不同处理:

  • 全中文模板:纯数值(底图已印 MPa),英制带 Lb

  • 中英文模板:数值+单位(底图可能无单位印刷)

  • 俄英文模板:数值+单位(底图可能无单位印刷)

各模板的 VBA 实现:

' 全中文模板
.Cells(6,2) = Format(确认压力(.Cells(2,14+OfSet)), "#0.0")
' 英制: .Cells(6,2) = Space(14-Len(Trim(str_ylA))) & Trim(str_ylA)
' 中英文/俄英文模板
.Cells(6,2) = str_ylB
参数:
  • pn_value (str) -- 纯数值,如 "2.5", "150"

  • pn_unit (str) -- 单位,如 "MPa", "Lb", ""

  • template_type (str) -- 模板类型 "全中文" / "中英文" / "全英文" / "俄英文"

返回:

适合打印的显示文本

返回类型:

str

auto_learn(model, pn_value, pn_unit, test_standard='', certificate_no='')[源代码]

自动记录新型号到 model_param_mappings 表

对标 VBA CanShuSheet 的自动追加行为。

参数:
  • model (str) -- 产品型号

  • pn_value (str) -- 压力数值

  • pn_unit (str) -- 压力单位

  • test_standard (str) -- 试压标准号

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

返回:

是否成功

返回类型:

bool