"""质保书系列模板规格(列映射 + 区块行号)。引擎不硬编码,差异在此描述。"""
from __future__ import annotations
from certflow.services.report_migration.report_fill_engine import ZhiBaoShuSpec
# 产品行写格列:Layout B(有出厂编号 + 标准号)——5行/6行/9行[有编号与标准]/9行[及温度] 共用
_PRODUCT_COLS = {
"序号": 1,
"产品名称": 2,
"产品型号": 4,
"规格": 6,
"数量": 7,
"产品编号": 8,
"试验标准": 10,
"壳体压力": 13,
"壳体时间": 14,
"上密封压力": 15,
"上密封时间": 16,
"密封压力": 17,
"密封时间": 18,
"结果": 19,
}
_PRODUCT_MERGES = {
"产品名称": (2, 3),
"产品型号": (4, 5),
"产品编号": (8, 9),
"试验标准": (10, 12),
}
# Layout A(只有标准号:无出厂编号列,试验标准在 col8)
_PRODUCT_COLS_A = {
"序号": 1,
"产品名称": 2,
"产品型号": 4,
"规格": 6,
"数量": 7,
"试验标准": 8,
"壳体压力": 13,
"壳体时间": 14,
"上密封压力": 15,
"上密封时间": 16,
"密封压力": 17,
"密封时间": 18,
"结果": 19,
}
_PRODUCT_MERGES_A = {
"产品名称": (2, 3),
"产品型号": (4, 5),
"试验标准": (8, 9),
}
# Layout B + 适用温度(col12)
_PRODUCT_COLS_WENDU = dict(_PRODUCT_COLS)
_PRODUCT_COLS_WENDU["适用温度"] = 12
# 材质行写格列
_MATERIAL_COLS = {
"序号": 1,
"零件名称": 2,
"材料": 3,
"化学成分": {
"C": 4,
"Mn": 5,
"Si": 6,
"S": 7,
"P": 8,
"Cr": 9,
"Ni": 10,
"Mo": 11,
"V": 12,
"Cu": 13,
},
"力学性能": {"ReL": 15, "Rm": 16, "A": 17, "Z": 18},
"结果": 19,
# 第 11 化学列之后的空闲溢出格(质保书 col 14),承接不在表头 10 映射集的特殊元素
# (如 Nb/N/W),换行 join "元素=模拟值";材质证明书 Ti 占 col 14,不声明此键。
"化学成分溢出": 14,
}
# 试压报告产品行写格列(壳体/上密封/密封 各占 压力+时间 两列)
_SHIYAN_COLS = {
"序号": 1,
"产品名称": 2,
"产品型号": 3,
"规格": 4,
"数量": 5,
"产品编号": 6,
"试验标准": 7,
"壳体压力": 8,
"壳体时间": 9,
"上密封压力": 10,
"上密封时间": 11,
"密封压力": 12,
"密封时间": 13,
"结果": 14,
}
# 试压(中英):型号规格合并为单列(col3)
_SHIYAN_ZHONGYING_COLS = {
"序号": 1,
"产品名称": 2,
"型号规格": 3,
"数量": 4,
"产品编号": 5,
"试验标准": 6,
"壳体压力": 7,
"壳体时间": 8,
"上密封压力": 9,
"上密封时间": 10,
"密封压力": 11,
"密封时间": 12,
"结果": 13,
}
# 材质证明书 产品列(身份 + 零件材质;硬度列兼作结果)
_CAIZHI_COLS = {
"序号": 1,
"产品名称": 2,
"型号规格": 3,
"零件名称": 4,
"材料": 5,
"化学成分": {
"C": 6,
"Mn": 7,
"Si": 8,
"S": 9,
"P": 10,
"Cr": 11,
"Ni": 12,
"Mo": 13,
"Ti": 14,
"V": 15,
},
"力学性能": {"σs": 16, "σb": 17, "δ": 18, "ψ": 19},
"结果": 20,
}
[文档]
def zhibaoshu_6hang() -> ZhiBaoShuSpec:
return ZhiBaoShuSpec(
name="质保书6行",
k=6,
单条行数=2,
page_row_count=29,
page_col_count=19,
product_start=5,
material_header_rows=(12, 14),
material_start=15,
footer_rows=(27, 29),
product_cols=dict(_PRODUCT_COLS),
product_merges=dict(_PRODUCT_MERGES),
material_cols=dict(_MATERIAL_COLS),
)
[文档]
def zhibaoshu_5hang() -> ZhiBaoShuSpec:
# 每产品 3 零件;材质表头 11-13,数据 14 起;PageRowCount=31
return ZhiBaoShuSpec(
name="质保书5行",
k=5,
单条行数=3,
page_row_count=31,
page_col_count=19,
product_start=5,
material_header_rows=(11, 13),
material_start=14,
footer_rows=(30, 31),
product_cols=dict(_PRODUCT_COLS),
product_merges=dict(_PRODUCT_MERGES),
material_cols=dict(_MATERIAL_COLS),
)
[文档]
def zhibaoshu_9hang_biaozhunhao() -> ZhiBaoShuSpec:
"""质保书9行【只有标准号】:仅写标准号(无出厂编号列,试验标准在 col8),单号前缀 C/0。"""
return ZhiBaoShuSpec(
name="质保书9行只有标准号",
k=9,
单条行数=1,
page_row_count=42,
page_col_count=19,
product_start=5,
material_header_rows=(15, 17),
material_start=18,
footer_rows=(27, 29),
date_col=8,
number_col=16,
number_prefix="C/0 编号:",
product_cols=dict(_PRODUCT_COLS_A),
product_merges=dict(_PRODUCT_MERGES_A),
material_cols=dict(_MATERIAL_COLS),
)
[文档]
def zhibaoshu_9hang_bianhao_biaozhun() -> ZhiBaoShuSpec:
"""质保书9行【有编号与标准】:出厂编号(col8) + 标准号(col10),单号前缀 C/1。"""
return ZhiBaoShuSpec(
name="质保书9行有编号与标准",
k=9,
单条行数=1,
page_row_count=42,
page_col_count=19,
product_start=5,
material_header_rows=(15, 17),
material_start=18,
footer_rows=(27, 29),
date_col=8,
number_col=16,
number_prefix="C/1 编号:",
product_cols=dict(_PRODUCT_COLS),
product_merges=dict(_PRODUCT_MERGES),
material_cols=dict(_MATERIAL_COLS),
)
[文档]
def zhibaoshu_9hang_bianhao_biaozhun_wendu() -> ZhiBaoShuSpec:
"""质保书9行【有编号与标准及温度】:出厂编号 + 标准号 + 适用温度(col12),单号前缀 C/1。"""
return ZhiBaoShuSpec(
name="质保书9行有编号与标准及温度",
k=9,
单条行数=1,
page_row_count=42,
page_col_count=19,
product_start=5,
material_header_rows=(15, 17),
material_start=18,
footer_rows=(27, 29),
date_col=8,
number_col=16,
number_prefix="C/1 编号:",
product_cols=dict(_PRODUCT_COLS_WENDU),
product_merges=dict(_PRODUCT_MERGES),
material_cols=dict(_MATERIAL_COLS),
)
# 兼容别名:历史 zhibaoshu_9hang 实际对应「有编号与标准」布局
[文档]
def zhibaoshu_9hang() -> ZhiBaoShuSpec:
return zhibaoshu_9hang_bianhao_biaozhun()
[文档]
def shiyan_report_zhong() -> ZhiBaoShuSpec:
"""产品压力试验检测报告(中:每页25台,无材质块)。"""
return ZhiBaoShuSpec(
name="试压报告模板_中",
k=25,
单条行数=1,
page_row_count=31,
page_col_count=25,
product_start=5,
footer_rows=(30, 31),
date_row=2,
date_col=6,
number_row=2,
number_col=10,
number_prefix="C/1 N0:",
has_material=False,
product_cols=dict(_SHIYAN_COLS),
product_merges={},
material_cols={},
)
[文档]
def shiyan_report_shao() -> ZhiBaoShuSpec:
"""产品压力试验检测报告(少:每页13台,无材质块)。"""
return ZhiBaoShuSpec(
name="试压报告模板_少",
k=13,
单条行数=1,
page_row_count=25,
page_col_count=25,
product_start=7,
footer_rows=(20, 21),
date_row=2,
date_col=6,
number_row=2,
number_col=11,
number_prefix="C/1 N0:",
has_material=False,
product_cols=dict(_SHIYAN_COLS),
product_merges={},
material_cols={},
)
[文档]
def shiyan_report_zhongwen_shao() -> ZhiBaoShuSpec:
"""中英文试压报告模板-少:双语表头,每页 13 台,无材质块。"""
return ZhiBaoShuSpec(
name="中英文试压报告模板-少",
k=13,
单条行数=1,
page_row_count=22,
page_col_count=14,
product_block=True,
product_row_span=1,
has_material=False,
title_rows=(1, 7),
product_start=8,
date_row=2,
date_col=6,
number_row=2,
number_col=11,
number_prefix="C/1 N0:",
report_code="9.1-13",
product_cols=dict(_SHIYAN_COLS),
product_merges={},
material_cols={},
)
[文档]
def shiyan_report_zhongying() -> ZhiBaoShuSpec:
"""试压(中英):双语,每产品占 2 行(合并),每页 10 台,无材质块。
报告单号代号 8.2-20(区别于质保书/中英文试压的 9.1-13);日期格只存日期本身。
"""
return ZhiBaoShuSpec(
name="试压(中英)",
k=10,
单条行数=1,
page_row_count=32,
page_col_count=14,
product_block=True,
product_row_span=2,
has_material=False,
title_rows=(1, 6),
product_start=7,
date_row=2,
date_col=4,
number_row=2,
number_col=10,
number_prefix="C/0 N0:",
report_code="8.2-20",
date_label="",
product_cols=dict(_SHIYAN_ZHONGYING_COLS),
product_merges={},
material_cols={},
)
[文档]
def caizhi_1hang() -> ZhiBaoShuSpec:
"""材质1行:产品材质证明书,每产品 1 行材质(无独立产品表)。"""
return ZhiBaoShuSpec(
name="材质1行",
k=18,
单条行数=1,
page_row_count=26,
page_col_count=20,
product_block=False,
caizhi=True,
has_material=True,
title_rows=(1, 6),
product_start=7,
material_start=7,
date_row=2,
date_col=5,
number_row=2,
number_col=17,
number_prefix="C/1 N0:",
report_code="9.1-13",
date_label="",
product_cols={},
product_merges={},
material_cols=dict(_CAIZHI_COLS),
)
[文档]
def caizhi_2hang() -> ZhiBaoShuSpec:
"""材质2行:产品材质证明书,每产品 2 行材质。"""
return ZhiBaoShuSpec(
name="材质2行",
k=9,
单条行数=2,
page_row_count=26,
page_col_count=20,
product_block=False,
caizhi=True,
has_material=True,
title_rows=(1, 6),
product_start=7,
material_start=7,
date_row=2,
date_col=5,
number_row=2,
number_col=17,
number_prefix="C/1 N0:",
report_code="9.1-13",
date_label="",
product_cols={},
product_merges={},
material_cols=dict(_CAIZHI_COLS),
)
[文档]
def caizhi_3hang() -> ZhiBaoShuSpec:
"""材质3行:产品材质证明书,每产品 3 行材质(模板首例有阀体/阀杆/阀瓣样本)。"""
return ZhiBaoShuSpec(
name="材质3行",
k=6,
单条行数=3,
page_row_count=26,
page_col_count=20,
product_block=False,
caizhi=True,
has_material=True,
title_rows=(1, 6),
product_start=7,
material_start=7,
date_row=2,
date_col=5,
number_row=2,
number_col=17,
number_prefix="C/1 N0:",
report_code="9.1-13",
date_label="",
product_cols={},
product_merges={},
material_cols=dict(_CAIZHI_COLS),
)