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
- 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 ...
- 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作为回退(配置缺失时仍可用,不阻断打印)。
- static strip_unit(pressure_str)[源代码]¶
剥离压力字符串中的单位后缀
对标 VBA 确认压力() 第316行:
If 压力返回值 Like "*MPa" Then 压力返回值 = VBA.Replace(UCase(压力返回值), UCase("MPa"), "")
- 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)原样保留,不做换算。
- lookup_pn_from_db(model)[源代码]¶
从 model_param_mappings 表查询型号对应的压力信息
注意:此方法依赖 model_param_mappings 表已存在。 如果表尚未创建,返回 None。
- resolve_pn(model, template_pn=None)[源代码]¶
从型号解析公称压力,返回完整的 PN 信息字典
处理流程: 1. 判断是否英制型号(LB)→ 提取磅级并转 MPa 2. 否则优先用 ModelSpecParser 稳健解析型号内嵌压力(白名单,识别
PNxx/CLASSxx/标准压力代号,避免末尾温度/材质数字误判)
否则回退既有逻辑:数据库 model_param_mappings → 模板 PN → 型号后缀脆弱兜底提取
剥离单位后缀、返回标准化结果
- 参数:
- 返回:
包含以下键的字典
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"
- 返回类型:
- 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